Подтвердить что ты не робот

Как указать путь к общей библиотеке по умолчанию в 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 об этом.

Он представляет статическую/совместно используемую/динамически загруженную библиотеку, а также некоторый пример кода для их использования.

4b9b3361

Ответ 1

Есть два способа добиться этого:

  • Используйте опцию -rpath linker:

gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX -Wl,-rpath=/home/user/.usr/lib

  • Используйте переменную среды LD_LIBRARY_PATH - поместите эту строку в ваш файл ~/.bashrc:

    export LD_LIBRARY_PATH=/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