运行程序时找不到共享对象库,但在编译期间它已链接

时间:2017-07-31 14:58:52

标签: c++ linux linker g++

更新:问题解决了。该库是为Armv7a CPU制造的,但它是“软浮动”而不是“硬浮”。看起来我的机器是HF和非SF兼容的

我的程序依赖于一个名为libMyLib.so的外部构建.so库。当我编译这样的程序时:

$ g++ -std=c++11 main.cpp -o run -pthread

它报告说有很多未定义的引用,显然是因为我在编译时没有包含libMyLib.so。所以编译器知道编译程序需要什么。当我编译这样的程序时:

$ g++ -std=c++11 main.cpp -o run -pthread -lMyLib

它不报告任何错误并创建文件“run”。请注意,libMyLib.so已经在/ usr / local / lib中,看起来它在编译时已链接,因为现在定义了引用并且创建了“run”文件。但是当我运行文件时,会发生这种情况:

$ ./run
    ./run: error while loading shared libraries: libMyLib.so: cannot open shared object file: No such file or directory

我已经用ldd检查了它,它显示了我:

$ ldd run
    ...
    libMyLib.so => not found
    ...

所以ldd没有找到执行中的库,但它在编译时找到它。我对Linux和链接库很新,所以我不知道该怎么做。

此外,在.so文件上运行ldd会返回:

$ ldd /usr/local/lib/libMyLib.so
    not a dynamic executable

我已经检查过在错误的平台上运行.so文件时可能会出现此消息。但是我已经检查过了,这个库是为arm编译的(我正在使用覆盆子pi - > arm):

$  objdump -f /usr/local/lib/libMyLib.so | grep ^architecture
    architecture: arm, flags 0x00000150:

我还更新链接器:

$ sudo ldconfig -v
...
/usr/local/lib:
    libwiringPi.so -> libwiringPi.so.2.44
    libwiringPiDev.so -> libwiringPiDev.so.2.44
    libMyLib.so -> libMyLib.so.1
...

我真的不知道为什么会发生这种情况。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

首先检查LD_LIBRARY_PATH变量是否具有库目录的路径

$ echo $LD_LIBRARY_PATH

如果没有,则更新库路径。

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library

使用strace进行调试。

strace -f ./run

答案 1 :(得分:3)

/usr/local/lib是链接器默认搜索的目录之一 对于使用-l选项指定的库,因此您的链接成功。

然而,在运行时,程序加载器默认搜索链接 图书馆: -

  • /lib/usr/lib以及其名称和位置已缓存在ldconfig缓存中的库/etc/ld.so.cache
  • 环境变量LD_LIBRARY_PATH的值中列出的目录, 在当前的shell中。

ldconfig缓存仅在运行ldconfig时更新。请参阅man ldconfig

加载程序无法在运行时找到libMyLib.so,因为您没有 因为您将该库放在ldconfig/usr/local/lib中,所以请运行/usr/local/lib 你没有正确地将LD_LIBRARY_PATH添加到LD_LIBRARY_PATH 在您尝试运行程序的同一个shell中。

不方便,不需要特殊设置 ldconfig以使程序能够运行。

要使加载程序能够找到您的库,请以root身份运行/usr/local/lib。这个 如果/etc/ld.so.conf中列出/etc/ld.so.conf,则会成功, 或/usr/local/lib中包含的其中一个文件。如果不是,那么 您可以通过运行显式缓存来自ldconfig /usr/local/lib的共享库 {root} !DOCTYPE html>