【问题标题】:Run-time linker issue: "error while loading shared libraries"运行时链接器问题:“加载共享库时出错”
【发布时间】: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


    【解决方案1】:

    这可能是由于链接器无法找到临时依赖项。如果您直接链接到 EG:libboost_thread,那么应用程序运行时链接器将使用您在编译时定义的 -rpath 路径。

    但是,libboost_thread 可能需要 ITS OWN 库 libboost_system。问题是,libboost_thread 库的运行时链接器是否应该使用您的应用程序 -rpath?还是忽略它并使用它自己的系统搜索路径?您必须明确告诉运行时链接器它应该做什么。请注意,默认的运行时链接器搜索行为会根据您的编译器版本而变化。谷歌,RUNPATH 与 RPATH 和 -Wl,--disable-new-dtags

    我已经在另一个类似的问题中回答了这个问题:CMake project fails to find shared library

    虽然该用户正在使用 CMake 构建他们的应用程序,但潜在的问题也可能在这里发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 2011-05-29
      相关资源
      最近更新 更多