CentOS:从devtoolset使用GCC 4.7导致libstdc ++链接不正确(未定义的符号)

时间:2013-04-08 14:47:15

标签: gcc centos undefined-symbol devtoolset

我正在使用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脚本而不是实际的共享库。

2 个答案:

答案 0 :(得分:1)

GCC编译器及其库(非常特殊g++和相应的libstdc++运行时)需要匹配。使用较新的编译器进行编译(通常,如果支持该语言的新版本,几乎可以保证)会提供不适用于旧库的二进制文件。较旧的二进制文件可能使用较新的库,此处不作任何保证。

答案 1 :(得分:0)

  

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

这似乎是devtoolset-1-gcc中的错误,我认为已在最新版本的devtoolset中修复。

  

有趣的是,devtoolset中的libstdc ++再次链接到旧版本:

是的,这就是devtoolset gcc应该工作的方式(有关更多详细信息,请参见this answer)。

  

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

您无法使用GCC的devtoolset来做到这一点,因为它甚至没有新的libstdc++.so库。如您所见,该文件实际上是一个链接描述文件,它将您的二进制文件链接到libstdc++_nonshared.a /usr/lib64/libstdc++.so

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