2011-11-07 113 views
15

我想编译这里找到的项目之一 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有库目录作为../libi2cbrdg.so位于此目录中(i2c_bridge-0.0.1-rc2)。我也将该文件复制到/usr/local/lib。在i2c_bridge-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,它仍然给我的问题。

我只好带走-Werror-noWdecrepated(拼写?)选项中的所有makefile文件,让他们来编译,但应该不会影响这应该吗?

它还有什么需要找到.so文件?如果有人能帮我弄清楚什么是错的,我会非常感激。如果需要更多信息,我可以发布。

回答

39

你必须区分在编译时和运行时找到它。您在编译时提供的-L标志与运行时本地化库无关。这是通过嵌入库中的许多变量和一些路径完成的。

最好的热修复这个问题往往设置LD_LIBRARY_PATH的目录与.so文件,如:

$ LD_LIBRARY_PATH=.. ./i2c 

对于一个长期的解决方案,你需要或者有仔细看整个LD系统使用rpath和runpath,或者使用libtool(它可以为你解决这些问题)。

将文件复制到/ usr/local/lib目录往往是不够的,因为LD缓存可用库,所以你需要重新运行ldconfig(作为root)复制库到/ usr/local/lib目录之后。

+0

LD_LIBRARY_PATH是否适用于我所有的库?所以如果我做了这个命令,它会弄乱其他东西,直到我改回它?我如何看到它现在设置的是什么? – Sterling

+2

这是一个环境变量。因此,您可以通过“echo $ LD_LIBRARY_PATH”来检查它,并且它在命令行中设置的方式对于i2c进程及其子进程是本地的。 – thiton

+1

不是我的问题,但是感谢这帮助我解决了我的确切问题 – Rich

25

如果您正在构建从源代码需要在库中的代码,你可以把这个库是在环境变量LD_RUN_PATH建设之前的路径,链接器将这个路径保存到二进制文件,所以它将在运行时自动在正确的位置查找。

Linux特有的:或者,把库中/lib/usr/lib,或者在你的/etc/ld.so.conf或其进口配置片段中引用的一些其他的路径,然后将所有你需要做的就是运行/sbin/ldconfig刷新ld.so(动态链接)的库缓存。

+0

即使我在/etc/ld.so.conf.d/libc.conf中有'/ usr/local/lib',**动态链接库缓存刷新**与'sudo ldconfig'是什么对我来说。 –

1

这适用于我的问题,希望能帮助任何人。

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

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

相关问题