c++ - 冲突的 boost 版本

标签 c++ gcc boost dependencies shared-libraries

由于一些较旧的第三方代码,我已经使用较旧的 GCC ABI ( https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html) 编译了 boost::systemboost::serialization 我'我正在使用。

我将它们构建到 /usr/local/lib 中,它已经设置为链接器的有效路径(我也在那里使用其他库),并将它们重命名为:

$ ls /usr/local/lib/libboost_*

/usr/local/lib/libboost_serialization_old_abi.so
/usr/local/lib/libboost_serialization_old_abi.so.1.60.0
/usr/local/lib/libboost_system_old_abi.so
/usr/local/lib/libboost_system_old_abi.so.1.60.0
/usr/local/lib/libboost_wserialization_old_abi.so
/usr/local/lib/libboost_wserialization_old_abi.so.1.60.0

默认情况下,主流的 boost 库像往常一样位于 /usr/lib 下。发生的事情是,当我使用自定义标志 -lboost_system_old_abi-lboost_serialization_old_abi 将任何代码链接到这些特定库时,生成的二进制文件将链接到 默认 boost 库:

$ ldd darwin_socket

linux-vdso.so.1 (0x00007ffd137ea000)
/usr/local/webots/resources/projects/robots/darwin-op/libraries/darwin/libdarwin.so (0x00007fcb9edaa000)
libipsocket.so.1 => /usr/local/lib/libipsocket.so.1 (0x00007fcb9eb7b000)
libboost_system.so.1.60.0 => /usr/lib/libboost_system.so.1.60.0 (0x00007fcb9e977000)
libboost_serialization.so.1.60.0 => /usr/lib/libboost_serialization.so.1.60.0 (0x00007fcb9e739000)
libController.so => not found
libCppController.so => not found
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fcb9e3b7000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007fcb9e0b2000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fcb9de9c000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fcb9dafb000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcb9efc1000)
librt.so.1 => /usr/lib/librt.so.1 (0x00007fcb9d8f3000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fcb9d6d6000)

这很奇怪,因为如果使用原始的 -lboost_system-lboost_serialization 标志,由于新/旧 ABI,gcc 甚至无法链接到默认 boost 不兼容。

那么这里到底发生了什么?

最佳答案

问题是仅仅重命名自定义构建的库是不够的。库名称作为 soname 嵌入到库中(您可以使用 readelf -d 命令查看它),并在您的应用程序喜欢该库时使用。基本上,自定义库中的 soname 作为依赖项放入您的应用程序二进制文件中,并且由于它们与官方 Boost 库名称相同,因此会在运行时加载错误的二进制文件。

您必须确保自定义构建的 Boost 库在构建过程中正确命名。您可以通过向 b2 命令行添加 --buildid=old_abi 选项来尝试执行此操作。

关于c++ - 冲突的 boost 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36345922/

相关文章:

c++ - C++ Opengl 圆函数是如何工作的

c++ - 如何修复错误 "clang: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)"?

c++ - 用信号替换自旋锁

c++ - WxWidgets - 从主文件以外的文件更改 texbox

c++ - 在几分钟内构建所有的 Boost

c - 在 "relocation has invalid symbol index"错误期间会发生什么?

c++ - 容器、智能指针和模板化继承类

c++ - Boost.Spirit 可以在理论上/实践上用于解析 C++(0x)(或任何其他语言)吗?

c++ - 带有 std::shared_ptr 的 QVariant

c - 我的c代码有什么错误?