O problema que você tem está relacionado ao padrão C ++ 11 que requer uma implementação diferente de tipo (s) de string (e lista) C ++. Para compatibilidade, g ++ 5.2 e acima compila o novo tipo compatível com C ++ 11 por padrão, (se você especificar ou não -std = c ++ 11), mas você pode definir a macro
-D_GLIBCXX_USE_CXX11_ABI=0
para reverter para o tipo de cadeia C ++ antigo. A nova implementação da libstdc ++ contém ambas ABIs. Portanto, se você tiver binários com os quais você precisa se vincular à antiga ABI não-compatível, você deve definir a macro acima em suas compilações g ++. Isso deve produzir binários compatíveis com o antigo ABI.
Infelizmente, se você estiver usando bibliotecas do sistema operacional diferente das Bibliotecas Padrão C ++, a menos que essas bibliotecas sejam multi-arch no sentido de fornecer todas as funções que diferem pela ABI em ambas ABIs, então você está ferrado porque eles provavelmente só terão o novo ABI.
Tendo dito que eu tenho um problema em um antigo Ubuntu baixar um g ++ moderno não confiável que simplesmente se recusa a produzir o novo ABI. Então parece que o backport de ppa:ubuntu-toolchain-r/test
está de fato mal quebrado porque se recusa a produzir binários de acordo com a nova ABI.
De qualquer forma, a linha de fundo é quando você vincula tudo, seja a ABI antiga ou a nova ABI. A seguir você dirá qual você está usando:
g++ --version
echo '#include <string>' > test.cpp
echo 'void f(std::string s) {}' >> test.cpp
cat test.cpp
g++ -std=gnu++11 -c -o test.o test.cpp
nm test.o | c++filt
Se isso tiver
std::basic_string<char, ....
nele, é a ABI antiga . Se tiver
std::__cxx11::basic_string<char, ...
nele, é o novo ABI.