C++ 可执行文件在运行时找不到库,即使它位于 /usr/lib 中(在 Linux 上)

Posted

技术标签:

【中文标题】C++ 可执行文件在运行时找不到库,即使它位于 /usr/lib 中(在 Linux 上)【英文标题】:C++ Executable cannot find library at runtime, even though it's in /usr/lib (On Linux) 【发布时间】:2019-09-29 08:14:01 【问题描述】:

我正在使用 Ubuntu 上的 Panda3D 框架用 c++ 创建一个游戏。所有 Panda3D 共享库都在/usr/lib/panda3d 中,所有头文件都在/usr/include/panda3d 中。我正在用 SCons 编译,但我用 gcc 试过了,它是一样的,所以这里是命令:

g++ -o src/main.o -c -fPIC -O2 -std=gnu++11 -I/usr/include/python2.7 -I/usr/include/panda3d -Iinclude src/main.cpp

g++ -o Test src/main.o -L/usr/lib/panda3d -lp3framework -lpanda -lpandafx -lpandaexpress -lpandabullet -lp3dtoolconfig -lp3dtool -lp3direct -lpthread

这是我在运行可执行文件时遇到的错误:

./Test: error while loading shared libraries: libp3framework.so.1.11: cannot open shared object file: No such file or directory

代码中没有太多内容,只是初始化了一个 Panda3D 窗口,所以我怀疑这是罪魁祸首。

正如我之前所说,这些库位于/usr/lib/panda3d,我现在已经检查了大约一百万次,这让我发疯了。我想不出我会得到这个错误的单一原因。任何帮助表示赞赏:)

编辑:

我正在查看我的文件,/etc/ld.so.conf.d 中有一个 panda3d.conf 文件,其中一行:/usr/local/lib/x86_64-linux-gnu/panda3d。跟这个有关系吗?

编辑#2:

不幸的是,我使用上面编辑中的路径作为库路径并得到了相同的结果。

【问题讨论】:

调整库搜索路径后必须运行ldconfig 【参考方案1】:

我想不出我会收到此错误的单一原因。

原因很简单:动态加载器没有被告知要在/usr/lib/panda3d 中查找共享库,所以也没有。

你可以运行你的程序:

LD_DEBUG=files,libs ./Test

并观察加载程序正在搜索哪些目录。

panda3d.conf ... 一行:/usr/local/lib/x86_64-linux-gnu/panda3d

那是错误的目录(或者至少不是你的库所在的目录)。

解决此问题的一种方法是将上述路径更正为/usr/lib/panda3d 并运行sudo ldconfig

另一种方法是将-Wl,-rpath=/usr/lib/panda3d 添加到您的链接行。

【讨论】:

非常感谢,它成功了!到目前为止我只处理过静态库,所以我不知道你必须让链接器知道库在运行时的位置。

以上是关于C++ 可执行文件在运行时找不到库,即使它位于 /usr/lib 中(在 Linux 上)的主要内容,如果未能解决你的问题,请参考以下文章

在netbeans中运行makefile时找不到sdl2-config可执行文件

Java通过Eclipse运行时找不到文件

在 Azure 上托管时找不到位于我的根项目文件夹中的文件

vc2013运行C++时找不到系统指定文件?

在 Windows 7 x64 上使用 pgxnclient 时找不到 pg_config 可执行文件

安装 gulp-converter-tjs 时找不到 Python 可执行文件