运行程序时找不到共享对象库,但在编译过程中链接了它
shared object library not found when running program, but it's linked during compiling
>更新:问题已解决。该库是为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
- clang 插件:在编译过程中修改 AST
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- 运行程序时找不到共享对象库,但在编译过程中链接了它
- 为什么在编译过程中尽管有 -I(破折号大写 i)标志,但仍会出现未定义的引用错误?
- 如何在编译过程中输出C 类型信息
- 如何指示emscripten在编译过程中应在哪里找到源文件
- 编译过程中有许多错误opencv_contrib
- 在编译过程中组成一系列字符串
- 在编译过程中,琐碎的(没有效果的)代码什么时候会被删除
- C++ 'stod()'不起作用,'strtod()'编译过程中抛出错误
- C++;编译过程中的警告"enabled by default"是什么意思?
- 如何在编译过程中实现功能单元测试
- 在c++编译过程中,私有访问和公共访问是如何工作的
- 如何确保在C++编译过程中,参数将被视为常量
- 如何使用"python setup.py build"解决C++/C编译过程中的"conflicting types"错误?
- 如何在编译过程中编辑可执行文件,而不更改其源代码
- 编译过程中关于 boost 静态库的链接错误"undefined reference"
- Visual Studio 在编译过程中找不到头文件,尽管已指定包含目录
- 编译过程中出错
- 编译过程中无法从加速框架中链接BLAS -OS Yosemite 10.0.5