7

我正在使用 CentOS 6.3 的 devtoolset-1.0 来临时升级 GCC 版本。虽然我现在可以编译我的 C++ 应用程序,但最终的二进制文件缺少一些符号:

$ ldd -d -r myapp
$     [..]
$     libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003216e00000)
$     [..]
$ undefined symbol: _ZNSt8__detail15_List_node_base11_M_transferEPS0_S1_    (./myapp)
$ undefined symbol: _ZNSt8__detail15_List_node_base7_M_hookEPS0_      (./myapp)
$ undefined symbol: _ZNSt8__detail15_List_node_base9_M_unhookEv (./myapp)

我发现,这些是一些新功能,在“旧”libstdc++ 中没有,但在较新的 libstdc++ 中。在我的系统上,安装了 libstdc++(默认版本 4.4.7)和 devtoolset-1.0-libstdc++-devel(4.7 通过 devtoolset)。有趣的是,来自 devtoolset 的 libstdc++ 再次链接到旧的:

$ cat /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/libstdc++.so
$ /* GNU ld script
$    Use the shared library, but some functions are only in
$    the static library, so try that secondarily.  */
$ OUTPUT_FORMAT(elf64-x86-64)
$ INPUT ( /usr/lib64/libstdc++.so.6 -lstdc++_nonshared )

我真正想要的是替换 libstdc++ 绑定,但我不知道如何实现。我已经尝试设置 LD_LIBRARY_PATH 并指向 devtoolset 目录,但 libstdc++ 仍设置为旧位置。符号链接也没有成功,因为它是 ld 脚本而不是实际的共享库。

4

2 回答 2

2

最终的二进制文件缺少一些符号

这看起来像是 中的一个错误devtoolset-1-gcc,我认为该错误已在最新版本的 devtoolset 中得到修复。

有趣的是,来自 devtoolset 的 libstdc++ 再次链接到旧的:

是的,这就是 devtoolset gcc 应该如何工作的(有关更多详细信息,请参阅此答案)。

我真正想要的是替换 libstdc++ 绑定,但我不知道如何实现。

你不能用 GCC 的 devtoolset 做到这一点,因为它甚至没有一个新的libstdc++.so库。如您所见,该文件实际上是一个链接器脚本,它将您的二进制文件链接到libstdc++_nonshared.a /usr/lib64/libstdc++.so

由于没有新的libstdc++.so,您无法链接到它。

于 2018-10-02T15:12:49.913 回答
1

The GCC compiler and its libraries (very specially g++ and corresponding libstdc++ runtime) need to match. Compiling with a newer compiler will (very often, practically guaranteed if a new version of the language is supported) give binaries that don't work with an older library. Older binaries might work with a newer library, no guarantees here.

于 2013-04-08T14:54:33.863 回答