【发布时间】:2020-09-01 00:28:19
【问题描述】:
我正在开发一个由多个类似程序组成的 C++ 项目。每个都使用各种头文件和二进制文件,大约 80 个。我设法编译了每个程序,并成功运行了每个程序,但其中一个名为 VerifyServer。当我尝试运行它时,我收到以下错误:
./VerifyServer:加载共享库时出错:libboost_system.so.1.57.0:无法打开共享对象文件:没有这样的文件或目录
然而,奇怪的是:
我在尝试运行其他程序时也遇到了非常相似的错误,但后来我添加了
-Wl,-rpath=$(BOOST_LIB_HEADER_PATH)/stage/lib
到我的每个编译器参数,它工作。我设法运行每个程序,甚至VerifyServer错误消息中指示的文件也发生了变化。请注意,变量 BOOST_LIB_HEADER_PATH 已正确分配给我的 boost 库的路径。
由于我的运行时链接器未能找到此二进制文件以将其正确链接到我的程序,我尝试检查它无法找到哪些依赖项,所以当我运行时
ldd VerifyServer | grep boost(为了简单起见,我使用 grep)
我收到这条消息:
libboost_thread.so.1.57.0 => /path/to/boost_1_57_0/stage/lib/libboost_thread.so.1.57.0 (0x00007f34c9b36000)
libboost_serialization.so.1.57.0 => /path/to/boost_1_57_0/stage/lib/libboost_serialization.so.1.57.0 (0x00007f34c9ad1000)
libboost_system.so.1.57.0 => 未找到
所以,现在我假设系统二进制文件与其他文件不在同一个目录中。当我手动检查时,我发现很奇怪,它就在那里!所以我决定在一个运行没有任何问题的程序上做同样的事情,我使用
ldd IdentityProviderServer | grep boost
我收到以下消息:
libboost_thread.so.1.57.0 => /path/to/boost_1_57_0/stage/lib/libboost_thread.so.1.57.0 (0x00007f97b6094000)
libboost_serialization.so.1.57.0 => /path/to/boost_1_57_0/stage/lib/libboost_serialization.so.1.57.0 (0x00007f97b602f000)
libboost_system.so.1.57.0 => /path/to/boost_1_57_0/stage/lib/libboost_system.so.1.57.0 (0x00007f97b602a000)
libboost_filesystem.so.1.57.0 => /path/to/boost_1_57_0/stage/lib/libboost_filesystem.so.1.57.0 (0x00007f97b600d000)
当我看到系统二进制文件可以在与其他文件相同的位置找到时,我只是感到困惑。我不知道这里有什么问题。关于链接器的工作原理,我是否遗漏了什么?
请注意,这里我必须使用 1.57.0 版本的 boost。我无法将其更新到当前版本,并且我怀疑我的问题与 boost 的版本有关。
【问题讨论】:
标签: c++ linker runtime-error linker-errors