Я компилирую программу на 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
в начало или конец моей$PATH
переменной en` - добавление
/my/dir/libfoo.so.0
в качестве аргумента к g ++
libfoo.*
файлы существуют и где -.so
без.0
,.a
и т. Д.?Ответы:
Добавьте путь туда, где находится ваша новая библиотека
LD_LIBRARY_PATH
(на Mac у нее немного другое имя ...)Ваше решение должно работать с использованием
-L/my/dir -lfoo
опций, во время выполнения используйте LD_LIBRARY_PATH, чтобы указать местоположение вашей библиотеки.Осторожно с использованием LD_LIBRARY_PATH - вкратце (из ссылки):
ИЛИ
Используйте параметр rpath через gcc для компоновщика - путь поиска библиотеки времени выполнения, будет использоваться вместо поиска в стандартном каталоге (параметр gcc):
Это хорошее временное решение. Компоновщик сначала ищет библиотеки в LD_LIBRARY_PATH, а затем просматривает стандартные каталоги.
Если вы не хотите постоянно обновлять LD_LIBRARY_PATH, вы можете сделать это на лету из командной строки:
Вы можете проверить, что знает компоновщик библиотек об использовании (пример):
/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)
источник
LD_LIBRARY_PATH
ищется во время выполнения, во время компиляции, которое вы хотите установитьLIBRARY_PATH
. См. Gcc.gnu.org/onlinedocs/gcc/Environment-Variables.htmlgcc myFile.c -o myFile.o -l myLibraryBaseName -Wl,-rpath,locationOfMyLibrary -L locationOfMyLibrary
Это старый вопрос, но, кажется, никто об этом не упомянул.
Вам повезло, что эта штука вообще связывает.
Вам нужно было изменить
к этому:
Ваш компоновщик отслеживает символы, которые необходимо разрешить. Если он сначала читает библиотеку, в ней нет необходимых символов, поэтому символы в ней игнорируются. Укажите библиотеки после объектов, которые необходимо связать с ними, чтобы у вашего компоновщика были символы, которые можно было найти в них.
Кроме того,
-lfoo
он выполняет поиск файла с именемlibfoo.a
или поlibfoo.so
мере необходимости. Нетlibfoo.so.0
. Так что либоln
название, либо переименуйте библиотеку как подходящую.Процитируем страницу руководства gcc:
-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
, из-за чего компоновщик проигнорировал его из-за отсутствия каких-либо необходимых символов, потому что символы еще не нужны.источник
Указание абсолютного пути к библиотеке должно работать нормально:
g++ /my/dir/libfoo.so.0 ...
Вы не забыли удалить
-lfoo
после добавления абсолютного пути?источник
@
версионных символов? Минимальный пример: github.com/cirosantilli/cpp-cheat/blob/…В качестве альтернативы вы можете использовать переменные среды
LIBRARY_PATH
иCPLUS_INCLUDE_PATH
, которые соответственно указывают, где искать библиотеки и где искать заголовки (CPATH
также будут выполнять эту работу), без указания параметров -L и -I.Изменить:
CPATH
включает заголовок с-I
иCPLUS_INCLUDE_PATH
с-isystem
.источник
export LIBRARY_PATH = /path/to/lib
в том же консольном сеансе, где вы компилируетеЕсли кто-то используется для работы с DLL в Windows и вы хотите пропустить номера версий .so в linux / QT, добавление
CONFIG += plugin
приведет к удалению номеров версий. Чтобы использовать абсолютный путь к .so, передача его компоновщику работает нормально, как сказал г-н Клатчко.источник