运行程序时找不到共享对象库,但在编译过程中链接了它

shared object library not found when running program, but it's linked during compiling

本文关键字:编译 过程中 链接 程序 找不到 共享 对象 运行      更新时间:2023-10-16

>更新:问题已解决。该库是为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

它不报告任何错误并创建文件"运行"。请注意,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 编译的(我在树莓派 -> 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
...

我真的不知道为什么这仍然会发生。谁能帮我?

/usr/local/lib

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

但是,在运行时,程序加载程序默认搜索链接的 图书馆:-

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

ldconfig缓存仅在运行ldconfig时更新。见人ldconfig.

加载程序在运行时找不到libMyLib.so,因为您没有 运行ldconfig,因为您将该库放在/usr/local/lib和 您也没有正确地将/usr/local/lib添加到LD_LIBRARY_PATH在您尝试运行程序的同一外壳中。

要求特殊设置LD_LIBRARY_PATH使程序能够运行。

要使加载程序能够找到您的库,请以 root 身份运行ldconfig。这 如果/usr/local/lib列在/etc/ld.so.conf中,就会成功, 或/etc/ld.so.conf中包含的文件之一中。如果不是,那么/usr/local/lib您可以通过运行ldconfig /usr/local/lib,作为根。

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

$ echo $LD_LIBRARY_PATH

如果不存在,则更新库路径。

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

使用 strace 进行调试。

strace -f ./run