我正在一个由多个类似程序组成的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)
当我发现可以在其他位置的位置找到系统二进制文件时,我感到很困惑。我不知道这是什么问题。关于链接器的工作方式我缺少什么?
请注意,我必须在此处使用boost的1.57.0版本。我无法将其更新为当前版本,并且我怀疑我的问题与boost版本有关。

最佳答案

这可能是由于链接器无法找到临时依赖关系。如果直接针对EG:libboost_thread进行链接,则应用程序运行时链接程序将使用编译时定义的-rpath路径。
但是,libboost_thread可能需要它的OWN库libboost_system。问题是,libboost_thread库的运行时链接程序是否应使用您的应用程序-rpath?或忽略它并使用其自己的系统搜索路径?您必须明确告诉运行时链接程序它应该做什么。注意,默认的运行时链接程序搜索行为会根据您的编译器版本而变化。 Google,RUNPATH与RPATH和-Wl,-disable-new-dtags
我在另一个类似的问题中回答了这个问题:CMake project fails to find shared library
尽管该用户正在使用CMake构建其应用程序,但潜在的问题也可能在这里发生。

关于c++ - 运行时链接程序问题: “error while loading shared libraries”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63679802/

10-12 18:28