我正在尝试编译此处找到的项目之一 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
i2c_bridge-0.0.1-rc2/i2c
中的makefile的库目录为../
。 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
,它仍然会给我带来问题。
我必须在所有makefile中删除-Werror
和-noWdecrepated
(拼写?)选项才能让它们编译,但这应该不会影响它吗?
找到.so
文件还需要什么?如果有人能帮我找出问题所以我会非常感激。如果需要更多信息,我可以发布。
答案 0 :(得分:39)
你必须区分在编译时和运行时找到它们。您在编译时提供的-L标志与在运行时本地化库无关。这是通过许多变量和库中嵌入的一些路径来完成的。
此问题的最佳解决方法是将LD_LIBRARY_PATH设置为带有.so文件的目录,例如:
$ LD_LIBRARY_PATH=.. ./i2c
对于长期解决方案,您需要仔细查看具有rpath和runpath的整个LD系统,或者使用libtool(它可以为您解决这些问题)。
将文件复制到/ usr / local / lib通常是不够的,因为ld会缓存可用的库,因此在将库复制到/usr/local/lib后需要重新运行ldconfig(以root用户身份)。 p>
答案 1 :(得分:25)
如果要从源代码构建需要库的代码,可以在构建之前将库所在的路径放在环境变量LD_RUN_PATH中,链接器会将该路径保存到二进制文件中,这样它就会在运行时自动在正确的位置查找。
特定于Linux:或者,将库放在/lib
,/usr/lib
或/etc/ld.so.conf
或其导入的配置片段中引用的其他路径中,然后您需要做的就是运行/sbin/ldconfig
来刷新ld.so(动态链接器)的库缓存。
答案 2 :(得分:1)
这适用于我的问题,希望对任何人都有帮助。
gcc test.c -Wl,-rpath /usr/local/lib -lfcgi -o test.fcg
-Wl,-rpath
选项是关键技巧。