无法打开共享对象文件

时间:2011-11-07 16:36:51

标签: build find debian shared-objects

我正在尝试编译此处找到的项目之一 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/libls目录的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文件还需要什么?如果有人能帮我找出问题所以我会非常感激。如果需要更多信息,我可以发布。

3 个答案:

答案 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选项是关键技巧。