【问题标题】:Cannot open shared object file无法打开共享对象文件
【发布时间】:2011-12-23 18:49:34
【问题描述】:

我正在尝试编译此处找到的项目之一 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/libi2c_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,它仍然会给我带来问题。

我必须去掉所有 makefile 中的 -Werror-noWdecrepated(拼写?)选项才能让它们编译,但这不应该影响它吗?

它还需要什么才能找到.so 文件?如果有人可以帮助我找出问题所在,我将不胜感激。如果需要更多信息,我可以发布。

【问题讨论】:

  • cannot open shared object file 有时会通过发出 sudo ldconfig 来刷新先前编译和安装的包的共享库缓存以使其为下游包的编译做好准备

标签: build find debian shared-objects


【解决方案1】:

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

解决此问题的最佳热修复方法通常是将 LD_LIBRARY_PATH 设置为包含 .so 文件的目录,例如:

 $ LD_LIBRARY_PATH=.. ./i2c

对于长期解决方案,您需要使用rpathrunpath 仔细查看整个LD 系统,或者使用libtool(它为您的便携式解决了这些问题)。

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

【讨论】:

  • LD_LIBRARY_PATH 是否适用于我的所有库?所以如果我执行那个命令,它会弄乱其他事情,直到我把它改回来?我如何查看现在的设置?
  • 这是一个环境变量。因此,您可以通过“echo $LD_LIBRARY_PATH”检查它,并且它在命令行中设置的方式是 i2c 进程及其子进程的本地。
  • 不是我的问题,但感谢这有助于解决我的确切问题
【解决方案2】:

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

Linux 特定:或者,将库放在/lib/usr/lib 或在您的/etc/ld.so.conf 或其导入的配置片段中引用的其他路径中,然后您需要做的就是运行/sbin/ldconfig 以刷新ld.so(动态链接器)的库缓存。

【讨论】:

  • 尽管我在/etc/ld.so.conf.d/libc.conf 中有/usr/local/lib,但带有sudo ldconfig动态链接库缓存刷新 对我来说是这样的。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-04-21
    • 2013-05-05
    • 2017-05-21
    • 2012-05-24
    • 2014-02-10
    • 2021-01-06
    • 2018-07-03
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多