Как указать путь к общей библиотеке по умолчанию в GCC Linux? Получение "ошибки при загрузке разделяемых библиотек" при запуске
Существует ноутбук, на котором у меня нет привилегий root.
на компьютере У меня установлена библиотека с помощью configure --prefix=$HOME/.usr
.
после этого я получил эти файлы в ~/.usr/lib
:
libXX.so.16.0.0
libXX.so.16
libXX.so
libXX.la
libXX.a
когда я компилирую программу, которая вызывает одну из функций, предоставляемых библиотекой с помощью этой команды:
gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX
xxx.out был сгенерирован без предупреждения, но когда я запускаю его, как это было выбрано:
./xxx.out: error while loading shared libraries: libXX.so.16: cannot open shared object file: No such file or directory
, хотя libXX.so.16
находится там.
мое беспредметное предположение заключается в том, что ~/.usr/lib
не выполнялся при вызове xxx.out.
но что я могу сделать, чтобы указать путь .so, чтобы xxx.out мог искать там файл .so?
При добавлении -static
к gcc добавляется еще одна ошибка:
undefined reference to `function_proviced_by_the_very_librar'
Кажется, что .so
не имеет значения, даже если -L
и -L
заданы gcc.
что мне делать, чтобы построить полезную exe с этой библиотекой?
Для других людей, у которых есть тот же вопрос, что и я,
Я нашел полезную статью в tldp об этом.
Он представляет статическую/совместно используемую/динамически загруженную библиотеку, а также некоторый пример кода для их использования.
Ответы
Ответ 1
Есть два способа добиться этого:
- Используйте опцию
-rpath
linker:
gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX -Wl,-rpath=/home/user/.usr/lib
Это будет работать даже для предварительно сгенерированных двоичных файлов, поэтому вы можете, например, загрузить некоторые пакеты из debian.org, распаковать двоичные файлы и общие библиотеки в свои домашний каталог и запустить их без перекомпиляции.
Для быстрого теста вы также можете (в bash):
LD_LIBRARY_PATH=/home/user/.usr/lib ./xxx.out
который имеет то преимущество, что вы не изменяете путь к библиотеке для всего остального.
Ответ 2
Должно быть LIBRARY_PATH
вместо LD_LIBRARY_PATH
.
gcc проверяет на LIBRARY_PATH
, который можно увидеть с помощью опции -v