无法打开共享对象文件

Ste*_*ing 16 debian build find 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

makefile中i2c_bridge-0.0.1-rc2/i2c的库目录为../.在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
Run Code Online (Sandbox Code Playgroud)

(那i2c是一个目录)

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

我不得不在所有makefile中删除-Werror-noWdecrepated(拼写?)选项以使它们进行编译,但这不应该影响它吗?

找到.so文件还需要什么?如果有人能帮我找出问题所以我会非常感激.如果需要更多信息,我可以发布.

thi*_*ton 39

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

解决此问题的最佳方法是将LD_LIBRARY_PATH设置为带有.so文件的目录,例如:

 $ LD_LIBRARY_PATH=.. ./i2c
Run Code Online (Sandbox Code Playgroud)

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

将文件复制到/ usr/local/lib通常是不够的,因为ld会缓存可用的库,因此在将库复制到/ usr/local/lib之后需要重新运行ldconfig(以root身份运行).

  • 这是一个环境变量.因此,您可以通过"echo $ LD_LIBRARY_PATH"进行检查,并且在命令行中设置的方式对于i2c进程及其子进程是本地的. (2认同)

rak*_*ice 25

如果要从源代码构建需要库的代码,可以在构建之前将库所在的路径放在环境变量LD_RUN_PATH中,链接器会将该路径保存到二进制文件中,以便自动查找因为在运行时的正确位置.

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


ter*_*ian 5

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

gcc test.c -Wl,-rpath /usr/local/lib -lfcgi -o test.fcg
Run Code Online (Sandbox Code Playgroud)

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