Не удается открыть файл общих объектов

Я пытаюсь скомпилировать один из проектов, найденных здесь. Интерфейсный адаптер 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 - это ключевой трюк.