我正在使用devtoolset-1.0来升级CentOS 6.3的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(通过devtoolset安装的4.7)。有趣的是,来自devtoolset的libstdc++链接到旧版本的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脚本而不是实际共享库。