Не удается открыть общий объектный файл - PullRequest
15 голосов
/ 07 ноября 2011

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

Файл makefile в 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 (правописание?) Во всех make-файлах, чтобы заставить их компилироваться, но это не должно повлиять на это, если это так?

Что ещедля этого нужно найти файл .so?Если кто-нибудь может помочь мне выяснить, в чем дело, я был бы очень благодарен.Если нужна дополнительная информация, я могу опубликовать ее.

Ответы [ 3 ]

39 голосов
/ 07 ноября 2011

Вы должны различать нахождение во время компиляции и во время выполнения.Флаг -L, который вы задаете во время компиляции, не имеет ничего общего с локализацией библиотеки во время выполнения.Это скорее делается с помощью ряда переменных и некоторых путей, встроенных в библиотеку.

Лучшим исправлением этой проблемы часто является установка LD_LIBRARY_PATH в каталог с файлом .so, например:

 $ LD_LIBRARY_PATH=.. ./i2c

Для долгосрочного решения вам необходимо либо внимательно изучить всю систему LD с помощью rpath и runpath, либо использовать libtool (который решает эти проблемы для вас переносимо).

Копированиефайла в / usr / local / lib часто бывает недостаточно, потому что ld кэширует доступные библиотеки, поэтому вам необходимо перезапустить ldconfig (как root) после того, как вы скопировали библиотеку в /usr/local/lib.

25 голосов
/ 03 февраля 2012

Если вы собираете код из источника, которому нужна библиотека, вы можете указать путь, в котором находится библиотека, в переменной среды LD_RUN_PATH перед сборкой, и компоновщик сохранит этот путь вдвоичный, так что он будет автоматически найден в нужном месте во время выполнения.

Специфично для Linux: В качестве альтернативы, поместите библиотеку в /lib, /usr/lib или в какой-либо другой путь, указанный в вашем /etc/ld.so.confили его импортированные фрагменты конфигурации, а затем все, что вам нужно сделать, это запустить /sbin/ldconfig, чтобы обновить кэш библиотек ld.so (динамического компоновщика).

1 голос
/ 25 марта 2017

Это работает для моей проблемы, надеюсь, поможет всем.

gcc test.c -Wl,-rpath /usr/local/lib -lfcgi -o test.fcg

И -Wl,-rpath опция - ключевой трюк.

...