#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, как я уже говорил выше. вы знаете почему?