Не удается открыть файл общих объектов
Я пытаюсь скомпилировать один из проектов, найденных здесь.
Интерфейсный адаптер USB-I2C/SPI/GPIO.
Я загрузил пакет i2c_bridge-0.0.1-rc2.tgz
. Я установил libusb
, и, похоже, у него не было проблем. Я перехожу в каталог i2c_bridge-0.0.1-rc2/
и делаю. Это компилируется. Я перехожу в папку i2c_bridge-0.0.1-rc2/i2c
и делаю. Он компилирует и дает мне ./i2c
. Однако, когда я запускаю его, он говорит error while loading shared libraries: libi2cbrdg.so: cannot open shared object file: No such file or directory
Файл make в i2c_bridge-0.0.1-rc2/i2c
имеет библиотечный каталог как ../
. libi2cbrdg.so
находится в этом каталоге (i2c_bridge-0.0.1-rc2
). Я также скопировал файл в /usr/local/lib
. ls
каталога i2c_bridge-0.0.1-rc2/
-
i2c i2cbrdg.d i2cbrdg.o libi2cbrdg.a Makefile tests
i2cbrdg.c i2cbrdg.h INSTALL libi2cbrdg.so README u2c4all.sh
(Это i2c
- это каталог)
Если я sudo ./i2c
, это все равно дает мне проблему.
Мне пришлось отменить параметры -Werror
и -noWdecrepated
(spelling?) во всех make файлах, чтобы их компилировать, но это не должно повлиять на это, если оно?
Что еще нужно, чтобы найти файл .so
? Если кто-нибудь может помочь мне узнать, что не так, я был бы очень благодарен. Если вам нужна дополнительная информация, я могу опубликовать ее.
Ответы
Ответ 1
Вы должны различать поиск таким образом во время компиляции и во время выполнения. Флаг -L, который вы даете во время компиляции, не имеет ничего общего с локализацией библиотеки во время выполнения. Это скорее выполняется с помощью ряда переменных и некоторых путей, встроенных в библиотеку.
Лучшее исправление для этой проблемы часто устанавливает LD_LIBRARY_PATH в каталог с .so файлом, например:
$ LD_LIBRARY_PATH=.. ./i2c
Для долгосрочного решения вам нужно либо внимательно изучить всю систему LD с помощью пути rpath и runpath, либо использовать libtool (который решает эти проблемы для вас переносимо).
Копирование файла в /usr/local/lib часто недостаточно, потому что ld кэширует доступные библиотеки, поэтому вам нужно повторно запустить ldconfig (как пользователь root) после копирования библиотеки в/usr/local/lib.
Ответ 2
Если вы создаете код из источника, который нуждается в библиотеке, вы можете поместить путь, в котором находится библиотека, в переменную среды LD_RUN_PATH перед построением, и компоновщик сохранит этот путь в двоичном формате, так что он будет автоматически искать в нужном месте во время выполнения.
Специфические для Linux: альтернативно, поместите библиотеку в /lib
, /usr/lib
или какой-либо другой путь, указанный в вашем /etc/ld.so.conf
или его импортированных фрагментах конфигурации, а затем все, что вам нужно сделать, это запустить /sbin/ldconfig
для обновления ld.so(динамический компоновщик) кэш библиотек.
Ответ 3
Это работает для моей проблемы, надеюсь, кто-то поможет.
gcc test.c -Wl,-rpath /usr/local/lib -lfcgi -o test.fcg
И -Wl,-rpath
- это ключевой трюк.