更新:问题解决了。该库是为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
...
我真的不知道为什么会发生这种情况。任何人都可以帮助我吗?
答案 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>
。