Centos6 gcc6: ABI по умолчанию не обнаруживается при компиляции простого тестового файла c ++ 11

У меня есть образ докера для centos 6 с установленным devtoolset-6, и я хочу собрать свой код с новым ABI, доступным в gcc>=5, в этом случае gcc6, Почему-то у меня не получается то, что я ожидаю по умолчанию. Я пробовал разные варианты, но я в растерянности, что за тривиальная вещь мне не хватает.

Любое предложение, что я пропускаю, будет принята с благодарностью …

При составлении примера кода ниже я ожидал увидеть:

$ gcc -c test.cpp –o test.o
$ nm test.o
0000000000000000 T _Z1fNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
0000000000000000 r _ZStL19piecewise_construct

Строим следующее Dockerfile генерирует изображение centos6 с помощью gcc6:

FROM        centos:6
MAINTAINER  [email protected]

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

Так что, очевидно, мне не хватает чего-то тривиального.

Любая помощь?

2

Решение

Проблема заключалась в том, что компилятор gcc6 в devtoolset-6 не имел правильного stdlib, как предложил Praetorian.

Компиляция gcc6 с нуля решает проблему.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]