Как указать предпочтение пути к библиотеке?
я компилирую программу на c++ с помощью g++
и ld
. У меня есть .so
библиотека, которую я хочу использовать во время компоновки. Однако библиотека с тем же именем существует в /usr/local/lib
и ld
выбирает эту библиотеку над той, которую я непосредственно указываю. Как я могу это исправить?
для примеров ниже, мой файл библиотеки /my/dir/libfoo.so.0
. Вещи, которые я пробовал, которые не работают:
- моя команда g++ - это
g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp
- добавлять
/my/dir
в начало или конец моей Ан` - добавлять
/my/dir/libfoo.so.0
в качестве аргумента для g++
5 ответов:
добавьте путь туда, где находится Ваша новая библиотека
LD_LIBRARY_PATH
(Он имеет немного другое имя на Mac ...)ваше решение должно работать с помощью
-L/my/dir -lfoo
параметры, во время выполнения используйте LD_LIBRARY_PATH, чтобы указать местоположение вашей библиотеки.или
используйте параметр rpath через gcc для компоновщика-путь поиска библиотеки времени выполнения, будет использоваться вместо того, чтобы смотреть в стандартном dir (опция gcc):
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
это хорошо для временного решение. Компоновщик сначала ищет LD_LIBRARY_PATH для библиотек, прежде чем искать в стандартных каталогах.
если вы не хотите постоянно обновлять LD_LIBRARY_PATH, вы можете сделать это на лету в командной строке:
LD_LIBRARY_PATH=/some/custom/dir ./fooo
вы можете проверить, какие библиотеки линкер знает об использовании (пример):
/sbin/ldconfig -p | grep libpthread libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0
и вы можете увидеть, какие библиотеки использует приложение:
ldd foo linux-gate.so.1 => (0xffffe000) libpthread.so.0 => /lib/libpthread.so.0 (0xb7f9e000) libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7e6e000) librt.so.1 => /lib/librt.so.1 (0xb7e65000) libm.so.6 => /lib/libm.so.6 (0xb7d5b000) libc.so.6 => /lib/libc.so.6 (0xb7c2e000) /lib/ld-linux.so.2 (0xb7fc7000) libdl.so.2 => /lib/libdl.so.2 (0xb7c2a000) libz.so.1 => /lib/libz.so.1 (0xb7c18000)
указание абсолютного пути к библиотеке должно работать нормально:
g++ /my/dir/libfoo.so.0 ...
вы не забыли удалить
-lfoo
Как только вы добавили абсолютный путь?
в качестве альтернативы можно использовать переменные окружения
LIBRARY_PATH
иCPLUS_INCLUDE_PATH
, которые, соответственно, указывают, где искать библиотеки и где искать заголовки (CPATH
также будет выполнять эту работу), без указания параметров-L и-I.изменить:
CPATH
содержит заголовок с-I
иCPLUS_INCLUDE_PATH
С-isystem
.
это старый вопрос, но никто, кажется, не упоминали об этом.
вам повезло, что эта штука вообще была связана.
вам нужно изменить
g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp
для этого:
g++ -g -Wall -o my_binary -L/my/dir bar.cpp -lfoo
ваш компоновщик отслеживает символы, которые он должен решить. Если он сначала читает библиотеку, он не имеет никаких необходимых символов, поэтому он игнорирует символы в нем. Укажите библиотеки после того, что нужно чтобы связать с ними так, чтобы ваш линкер имеет символы, чтобы найти в них.
и
-lfoo
делает его поиск специально для файла с именемlibfoo.a
илиlibfoo.so
по мере необходимости. Неlibfoo.so.0
. Так что либоln
имя или переименовать в библиотеке произошла ошибка.цитировать страницу ССЗ:
-l library ... It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded.
добавление файла непосредственно в
g++
командная строка должна была работать, если, конечно, вы не ставите его передbar.cpp
, в результате компоновщик игнорировать его за отсутствие каких-либо необходимых символов, потому что нет символы были еще нужны.