конфликты имен общих объектов

#linux #boost #shared-libraries

#linux #повышение #разделяемые библиотеки

Вопрос:

Мое приложение ссылается на libboost_python (версия: 1.46.1) на хосте A (ОС: Ubuntu 11.04). Библиотека собрана из исходного кода, и ее информация выглядит следующим образом:

 lrwxrwxrwx 1 henry henry      25 2011-11-10 14:33 libboost_python.so -> libboost_python.so.1.46.1
-rwxr-xr-x 1 henry henry  379867 2011-11-10 14:33 libboost_python.so.1.46.1
  

Когда я запускаю свое приложение на хосте B (ОС: Ubuntu 11.10), я устанавливаю libboost_python с той же версией, что и apt. Его информация немного отличается:

 lrwxrwxrwx 1 root root     30 2011-06-03 14:54 /usr/lib/libboost_python-py27.so -> libboost_python-py27.so.1.46.1
-rw-r--r-- 1 root root 291224 2011-06-03 14:54 /usr/lib/libboost_python-py27.so.1.46.1
lrwxrwxrwx 1 root root     23 2011-11-09 04:34 /usr/lib/libboost_python.so -> libboost_python-py27.so
  

Конечная цель, связанная libboost_python.то же самое происходит и с другими (хост B имеет ‘py27’). Итак, когда я запускаю свое приложение, возникает ошибка:

 error while loading shared libraries: libboost_python.so.1.46.1: cannot open shared object file: No such file or directory
  

Как я могу исправить это конфликтующее имя?
вывод при запуске cmd ‘readelf -d myapp’:

  0x00000001 (NEEDED)                     Shared library: [libboost_python.so.1.46.1]
 0x00000001 (NEEDED)                     Shared library: [libboost_system.so.1.46.1]
 0x00000001 (NEEDED)                     Shared library: [libpython2.7.so.1.0]
 0x00000001 (NEEDED)                     Shared library: [libjuserclass.so.0]
 0x00000001 (NEEDED)                     Shared library: [libstdc  .so.6]
  

любопытно то, что запись для boost сохраняет не so-name, а полное имя библиотеки.

Комментарии:

1. Кстати, вы должны принять некоторые ответы на свои вопросы. Останавливает их отображение как вопросов без ответов и проявляет некоторую вежливость к людям, которые потрудились ответить.

Ответ №1:

Здесь у вас есть два варианта: чистый (перекомпилировать в соответствии с новой схемой именования) и грязный (создать ссылочное представление старой библиотеки).

Разработчики Ubuntu (и, возможно, вышестоящие) сочли разумным включить версию python в версию библиотек boost_python. Вам необходимо установить ссылку на правильную версию libboost_python для python, и имя «libboost_python-py27.so.1.46.1» гарантирует это. Возможно, вы подключились к Python 2.6 на своей машине разработки и никогда не осознавали этого, пока ваша программа не завершилась сбоем. Вам следует повторно связать свою программу с более новой версией libboost-python1.46-dev пакета, который поставляется с Ubuntu 11.10. Либо полностью обновите свой компьютер разработки до более новой Ubuntu, либо выборочно извлеките новую версию libboost-python1.46-dev .

Грязное исправление выполняется немного быстрее:

 user@B> sudo ln -s libboost_python-py27.so.1.46.1 libboost_python.so.1.46.1
  

Редактировать: Совершенно правильно, чтобы версионные имена библиотек отображались в связанном исполняемом файле. Причина проста: в вашей системе может быть установлено несколько версий libboost, причем некоторые программы связаны, например, с 1.46.1, а некоторые — с 1.47.1. Неверсионное имя файла .so предназначено компоновщику на этапе компиляции и связано с той же версией, что и установленные заголовки boost. После компиляции необходимы только версии .so.

Комментарии:

1. спасибо thiton. У меня есть еще один вопрос о so-name, как я уже говорил выше. вы знаете почему?