我正在使用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脚本而不是实际的共享库。
答案 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
,因此无法链接到它。