Почему бы игнорировать беговую дорожку?
На CentOS 7.2 я создал приложение с g++ 4.8.5, которое не может работать, потому что не может найти библиотеку, которая существует в его runpath
, Я почти уверен, что это сработало две недели назад. Что может вызвать это?
$ ./app
./app: error while loading shared libraries: libhdf5.so.9: cannot open shared object file: No such file or directory
$ ldd ./app | grep libhdf5
libhdf5.so.9 => not found
$ readelf fotalg_test_unit -d | grep path
0x000000000000001d (RUNPATH) Library runpath: [/opt/ProductName/lib:/opt/ProductName/lib/private]
$ ll /opt/ProductName/lib/libhdf5.so*
lrwxrwxrwx. 1 fotechd fotechd 16 Oct 26 14:38 /opt/ProductName/lib/libhdf5.so -> libhdf5.so.9.0.0
lrwxrwxrwx. 1 fotechd fotechd 16 Oct 26 14:38 /opt/ProductName/lib/libhdf5.so.9 -> libhdf5.so.9.0.0
-rwxr-xr-x. 1 fotechd fotechd 3316074 Oct 26 14:35 /opt/ProductName/lib/libhdf5.so.9.0.0
настройка LD_LIBRARY_PATH
исправляет это временно:
$ LD_LIBRARY_PATH=/opt/ProductName/lib ./app
...
OK
0 ответов
Я смог решить эту проблему на моей стороне. Для меня это было потому, что не найденная библиотека была косвенной и runpath
на самом деле не разрешает косвенные зависимости. Я исправил это с помощью rpath
вместо runpath
передавая дополнительный -Wl,--disable-new-dtags
опция компоновщика для компилятора.
Здесь есть хорошее и подробное объяснение: как установить RPATH и RUNPATH с GCC/LD?
Чтобы найти общие объекты, dlopen() выполняет поиск в следующем порядке:
- путь поиска библиотеки времени выполнения, который был установлен с помощью параметра -rpath для ld (см. Справочник по утилитам), когда двоичный файл был связан
- каталоги, указанные в переменной среды LD_LIBRARY_PATH
- каталоги, указанные в строке конфигурации _CS_LIBPATH
Это выглядит
dlopen()
не проверяет
RUNPATH
.