我有一个安装了 devtoolset-6 的 centos 6 的 docker 镜像,我想使用gcc>=5
中提供的新 ABI 构建我的代码,在本例中gcc6
。不知何故,我没有得到我期望的默认工作。我已经尝试了各种变化,但我不知所措,我错过了什么微不足道的东西。
我缺少的任何建议将不胜感激...
在编译下面的示例代码时,我希望看到:
$ gcc -c test.cpp –o test.o
$ nm test.o
0000000000000000 T _Z1fNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
0000000000000000 r _ZStL19piecewise_construct
构建以下Dockerfile
会生成一个使用 gcc6 的 centos6 映像:
FROM centos:6
MAINTAINER aap.noot@gmail.com
RUN yum -y update
&& yum clean all
&& yum -y install make
&& yum clean all
RUN yum -y install centos-release-scl
&& yum -y install devtoolset-6-gcc devtoolset-6-binutils devtoolset-6-gcc-c++
&& yum clean all
&& echo 'source /opt/rh/devtoolset-6/enable' >> ~/.bashrc
RUN /usr/bin/scl enable devtoolset-6 true
ENTRYPOINT ["/usr/bin/scl", "enable", "devtoolset-6", "--"]
CMD ["/usr/bin/scl", "enable", "devtoolset-6", "--", "/bin/bash"]
并运行映像
docker run -it centos6_gcc6_test
以下代码片段未给出预期的结果
g++ --version
echo '#include <string>' > test.cpp
echo 'void f(std::string s) {}' >> test.cpp
cat test.cpp
g++ -c -o test.o test.cpp
nm test.o | c++filt
我得到了旧的 ABI 版本,即使 gcc 文档指出默认设置是生成新的 ABI
[root@3b58135d30a2 /]# g++ --version
g++ (GCC) 6.2.1 20160916 (Red Hat 6.2.1-3)
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[root@3b58135d30a2 /]# echo '#include <string>' > test.cpp
[root@3b58135d30a2 /]# echo 'void f(std::string s) {}' >> test.cpp
[root@3b58135d30a2 /]# cat test.cpp
#include <string>
void f(std::string s) {}
[root@3b58135d30a2 /]# g++ -c -o test.o test.cpp
[root@3b58135d30a2 /]# nm test.o | c++filt
0000000000000000 T f(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)
0000000000000000 r std::piecewise_construct
[root@3b58135d30a2 /]#
即使使用-D_GLIBCXX_USE_CXX11_ABI=1
显式编译,它仍然会给出不正确的结果:
[root@3b58135d30a2 /]# g++ -D_GLIBCXX_USE_CXX11_ABI=1 -c -o test.o test.cpp
[root@3b58135d30a2 /]# nm test.o | c++filt
0000000000000000 T f(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)
0000000000000000 r std::piecewise_construct
所以显然我错过了一些微不足道的东西。
有什么帮助吗?
问题是devtoolset-6中的gcc6编译器没有像Praetorian建议的那样具有正确的stdlib。
从头开始编译 gcc6 编译器可以解决这个问题。