Build 无法打开共享对象文件
我正在尝试编译一个在这里找到的项目 USB-I2C/SPI/GPIO接口适配器 我下载了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
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
刷新先前编译和安装的包的共享库缓存来解决,以便为下游包的编译做好准备