Как указать предпочтение пути к библиотеке?


я компилирую программу на 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 70

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, в результате компоновщик игнорировать его за отсутствие каких-либо необходимых символов, потому что нет символы были еще нужны.

если он используется для работы с DLL в Windows и хотел бы пропустить. поэтому номера версий в linux / QT, добавив CONFIG += plugin будет принимать номера версий. Чтобы использовать absolute path to. so, предоставление его компоновщику отлично работает, как упоминал г-н Клатчко.