2016-05-18 12 views
2

меня в пути /home/test/lib/libTest.so в .so и исполняемым называется myexec, который построен с RPATH указывая на /home/test/lib/. Однако, когда я сделал ldd на myexec, он говорит, что libTest.so не найден, и мне нужно было сделать export LD_LIBRARY_PATH, чтобы он работал.C++ не найден в исполняемом

Я подтвердил:

  1. libTest.so существует в /home/test/lib/
  2. objdump -x myexec | grep RUNPATH действительно указывает /home/test/lib/ встроен в исполняемый файл.

У кого-нибудь есть идея, почему он не смог найти библиотеку без установки LD_LIBRARY_PATH?

+0

[MVCE] (http://stackoverflow.com/help/mcve), –

ответ

1

От here:

В Linux переменная среды LD_LIBRARY_PATH представляет собой разделенные двоеточия набора каталогов, где библиотеку следует искать первых, перед стандартным набором каталогов

Как совет, вы должны быть осторожны, чтобы не полностью заменить ваш LD_LIBRARY_PATH. Это может испортить путь для системных разделяемых библиотек. Всегда используйте export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/path.

EDIT 1:

Что касается rpath, убедитесь, что libTest.so не зависит от какой-либо другой библиотеки. В качестве альтернативы вы можете использовать опцию -rpath-link в НКУ вместо -rpath, как видно here:

-rpath-Link DIR

При использовании ELF или SunOS, одна разделяемая библиотека может потребоваться другой. Это происходит, когда ссылка ld -shared включает в себя общую библиотеку как один из входных файлов. Когда компоновщик сталкивается с такой зависимостью при выполнении не-разделяемой, неперемещаемой ссылки, он автоматически попытается найти нужную общую библиотеку и включить ее в ссылку, если она не включена явно. В этом случае параметр -rpath-link указывает первый набор каталогов для поиска.

EDIT 2:

Если вы хотите получить больше помощи, пожалуйста, укажите:

  1. Точный параметр rpath используется во время компиляции
  2. Выход для ldd /path/to/binary команды
  3. Выход для readelf -d /path/to/binary
+1

Это действительно вопрос? OP спросил, почему необходима внешняя переменная среды ('LD_LIBRARY_PATH'), когда необходимый путь уже был встроен в исполняемый файл. – Spencer

+0

Я признаю, что ответ был неудовлетворительным. Я просто редактировал его, запрашивая дополнительную информацию. Извини за это. –