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