Build 无法打开共享对象文件

Build 无法打开共享对象文件,build,find,debian,shared-objects,Build,Find,Debian,Shared Objects,我正在尝试编译一个在这里找到的项目 USB-I2C/SPI/GPIO接口适配器 我下载了i2c_桥-0.0.1-rc2.tgz软件包。我安装了libusb,看起来运行良好,没有问题。我进入i2c_桥接器-0.0.1-rc2/目录并制作。这就是汇编。我进入i2c_桥接器-0.0.1-rc2/i2c文件夹并制作。它编译并提供/i2c。但是,当我运行它时,它在加载共享库时显示错误:libi2cbrdg.so:无法打开共享对象文件:没有这样的文件或目录 i2c_-bridge-0.0.1-rc2/i2c

我正在尝试编译一个在这里找到的项目 USB-I2C/SPI/GPIO接口适配器

我下载了
i2c_桥-0.0.1-rc2.tgz
软件包。我安装了
libusb
,看起来运行良好,没有问题。我进入
i2c_桥接器-0.0.1-rc2/
目录并制作。这就是汇编。我进入
i2c_桥接器-0.0.1-rc2/i2c
文件夹并制作。它编译并提供
/i2c
。但是,当我运行它时,它在加载共享库时显示
错误:libi2cbrdg.so:无法打开共享对象文件:没有这样的文件或目录

i2c_-bridge-0.0.1-rc2/i2c
中的makefile的库目录为
。/
。libi2cbrdg.so在这个目录中(
i2c_桥-0.0.1-rc2
)。我还将文件复制到
/usr/local/lib
i2c_桥-0.0.1-rc2/
目录的
ls

i2c        i2cbrdg.d  i2cbrdg.o  libi2cbrdg.a   Makefile  tests
i2cbrdg.c  i2cbrdg.h  INSTALL    libi2cbrdg.so  README    u2c4all.sh
(i2c是一个目录)

如果我
sudo./i2c
,它仍然会给我带来问题

我必须去掉所有makefile中的
-Werror
-nowdeparted
(拼写?)选项,才能让它们进行编译,但这不应该影响这一点,对吗


查找
.so
文件还需要什么?如果有人能帮我找出问题所在,我将不胜感激。如果需要更多信息,我可以发布。

您必须区分在编译时和运行时查找
so
。编译时给出的
-L
标志与在运行时本地化库无关。这是通过库中嵌入的许多变量和一些路径来实现的

解决此问题的最佳热修复程序通常是将LD_LIBRARY_路径设置为带有
的目录。因此
文件,例如:

 $ LD_LIBRARY_PATH=.. ./i2c
对于长期解决方案,您需要使用
rpath
runpath
仔细查看整个LD系统,或者使用
libtool
(这为您的便携设备解决了这些问题)


将文件复制到
/usr/local/lib
通常是不够的,因为
ld
缓存了可用的库,因此如果您是从需要库的源代码构建代码,则需要在将库复制到
/usr/local/lib

后重新运行
ldconfig
(以root用户身份),在构建之前,可以将库所在的路径放入环境变量中,链接器会将该路径保存到二进制文件中,以便在运行时自动在正确的位置查找该路径


Linux特定:或者,将库放入
/lib
/usr/lib
,或者
/etc/ld.so.conf
或其导入的配置片段中引用的其他路径,然后只需运行
/sbin/ldconfig
来刷新ld.so(动态链接器)的库缓存。

这对我的问题有效,希望会帮助任何人

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

-Wl,-rpath
选项是关键技巧。

是我所有库的LD\u LIBRARY\u路径吗?所以如果我做了那个命令,它会搞乱其他事情,直到我把它改回来?如何查看它现在设置为什么?它是一个环境变量。因此,您可以通过“echo$LD_LIBRARY_PATH”检查它,并且它在命令行中的设置方式是i2c进程及其子进程的本地设置。这不是我的问题,但感谢这帮助解决了我的确切问题,尽管我在
/etc/LD.So.conf.d/libc.conf
中有
/usr/local/lib
,使用
sudo ldconfig
刷新动态链接库缓存是为我做的。
无法打开共享对象文件
有时可以通过发出
sudo ldconfig
刷新先前编译和安装的包的共享库缓存来解决,以便为下游包的编译做好准备