lab*_*ito 5 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脚本而不是实际的共享库。
GCC编译器及其库(非常特殊g++且相应的libstdc++运行时)需要匹配。使用较新的编译器进行编译(通常情况下,如果支持该语言的新版本,则几乎可以保证)会给出无法与较旧的库一起使用的二进制文件。较旧的二进制文件可能适用于较新的库,但这里不保证。
| 归档时间: | 
 | 
| 查看次数: | 3008 次 | 
| 最近记录: |