Как указать нестандартный путь к разделяемой библиотеке в GCC Linux?Получение «ошибки при загрузке общих библиотек» при запуске - PullRequest
54 голосов
/ 12 января 2012

Есть ноутбук, на котором у меня нет привилегий 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 об этом.

В нем представлена ​​статическая / общая / динамически загружаемая библиотека, а также пример кода для их использования.

Ответы [ 2 ]

92 голосов
/ 12 января 2012

Для этого есть два способа:

  • Использовать -rpath опция компоновщика:

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

, который имеет преимущество в том, что не изменяет путь к вашей библиотеке для всего остального.

4 голосов
/ 28 ноября 2017

Должно быть LIBRARY_PATH вместо LD_LIBRARY_PATH.gcc проверяет LIBRARY_PATH, что можно увидеть с помощью опции -v

...