у меня есть .so
в пути /home/test/lib/libTest.so
и исполняемый файл под названием myexec
который построен с RPATH
указывая на /home/test/lib/
, Тем не менее, когда я сделал ldd
на myexec
это говорит libTest.so
не нашел и мне пришлось делать export LD_LIBRARY_PATH
для того, чтобы это работало.
Я подтвердил:
libTest.so
существует в /home/test/lib/
objdump -x myexec | grep RUNPATH
указывает ли /home/test/lib/
встроен в исполняемый файл.Кто-нибудь имеет представление, почему он не может найти библиотеку без настройки LD_LIBRARY_PATH
?
От Вот:
В Linux переменная среды LD_LIBRARY_PATH представляет собой набор каталогов, разделенный двоеточиями, в котором библиотеки следует искать в первую очередь, перед стандартным набором каталогов.
В качестве подсказки, вы должны быть осторожны, чтобы не заменить полностью свой LD_LIBRARY_PATH. Это может испортить путь для общих библиотек системы.
Всегда используйте export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/path
,
РЕДАКТИРОВАТЬ 1:
Для rpath
, удостоверься что libTest.so
не зависит ни от какой другой библиотеки. В качестве альтернативы вы можете использовать -rpath-link
опция в gcc вместо -rpath
, как видно Вот:
-rpath-link DIR
При использовании ELF или SunOS для одной общей библиотеки может потребоваться другая. Это происходит, когда общая ссылка ld включает общую библиотеку в качестве одного из входных файлов. Когда компоновщик сталкивается с такой зависимостью при создании не разделяемой, не перемещаемой ссылки, он автоматически попытается найти требуемую общую библиотеку и включить ее в ссылку, если она не включена явно. В таком случае опция -rpath-link указывает первый набор каталогов для поиска.
РЕДАКТИРОВАТЬ 2:
Если вам нужна дополнительная помощь, пожалуйста, предоставьте:
rpath
используется во время компиляцииldd /path/to/binary
командаreadelf -d /path/to/binary
Других решений пока нет …