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

更新:问题解决了.该库是为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编译的(我在树莓派上运行 – > 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
...

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

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

$echo $LD_LIBRARY_PATH

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

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

使用strace进行调试.

strace -f ./run

转载注明原文:c – 在运行程序时找不到共享对象库,但在编译期间它已链接 - 代码日志