2013-04-08 148 views
4

我为CentOS 6.3使用devtoolset-1.0以临时升级GCC版本。虽然我现在能够编译我的C++应用程序,最终的二进制缺少一些符号:CentOS:使用devtoolset中的GCC 4.7导致链接libstdC++不正确(未定义的符号)

$ 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++链接agains老之一:

$ 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脚本而不是实际的共享库。

+1

你曾经找到解决这个问题的办法吗?另外,我很好奇在调试版本和发布版本中是否有不同的缺失符号,这也是我观察到的。 – 2015-06-03 15:37:52

回答

1

GCC编译器及其库(特别是g++和相应的libstdc++运行时)需要匹配。使用较新的编译器进行编译将会得到(如果支持该语言的新版本,通常会得到实际保证)会提供不适用于较旧库的二进制文件。较旧的二进制文件可能与较新的库一起工作,这里没有保证。

相关问题