конфликты имен общих объектов - PullRequest
2 голосов
/ 10 ноября 2011

Мое приложение связывает 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.so, отличается (хост 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 не сохраняет так называемое имя, а полное имя библиотеки.

1 Ответ

0 голосов
/ 10 ноября 2011

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

Сопровождающие Ubuntu (и, возможно, апстрим) считают целесообразным включить версию Python в версию библиотек boost_python. Вам нужно связать с верной версией Python libboost_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

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

...