Como devo lidar com a incompatibilidade do ABI entre o gcc-4.9 e o gcc-5?

3

Eu recentemente atualizei minha máquina dev para o Ubuntu 16.04 (nova instalação, apagada 14.04)

A versão padrão do gcc é gcc-5.3.1 .

Um problema que eu tenho é uma biblioteca fornecida pelo fornecedor é construída apenas usando o gcc-4.9, que não é compatível com o gcc-5.

Pedi ao fornecedor para fornecer uma nova versão da biblioteca, mas é improvável que isso aconteça em breve.

Nesse meio tempo, instalei o gcc-4.9.3 dos repositórios de pacotes do Ubuntu.

Agora tenho o gcc-4.9 e o gcc-5 instalados:

ls -l /usr/bin/gcc*
lrwxrwxrwx 1 root root      5 May  9 11:49 /usr/bin/gcc -> gcc-5
-rwxr-xr-x 1 root root 838008 Apr 13 23:23 /usr/bin/gcc-4.9
-rwxr-xr-x 1 root root 915704 Apr 13 11:29 /usr/bin/gcc-5

Eu tentei construir nossa fonte com o gcc-4.9, mas agora eu me deparo com os mesmos problemas da ABI, mas indo por outro caminho.

O problema que tenho é que temos várias dependências que normalmente instalamos dos pacotes de distro

sudo apt-get install \
    python-dev \
    libbz2-dev \
    libboost-all-dev \
    libprotobuf-dev \
    libgoogle-perftools-dev \
    postgresql \
    libpqxx-dev

Embora eu possa configurar minha compilação para usar o gcc-4.9

mkdir build && cd build
CC=/usr/bin/gcc-4.9 CXX=/usr/bin/g++-4.9 cmake ..
make -j8

Agora obtenho erros de vinculador ao vincular com libtcmalloc_minimal.a , libprotobuf.a etc.

Então, o próximo passo que tentei foi remover todas as dependências instaladas das distribuições de distribuição e começar a construir as dependências a partir da fonte.

CC=/usr/bin/gcc-4.9 CXX=/usr/bin/g++-4.9 ./configure
make -j8
sudo make install

O problema aqui é que eu estou começando a descer um buraco de coelho. Cada dependência tem outras dependências e não tenho certeza de onde isso vai terminar.

A outra opção é fazer o downgrade para o Ubuntu 14.04 ou alguma versão que vem com o gcc-4.9 em vez do gcc-5.

Antes de tentar esta opção thurmonuclear, eu queria saber se há uma maneira melhor de fazer isso?

Talvez seja possível instalar a partir de repos criados com o gcc-4.9 ou de alguma outra forma?

    
por Steve Lorimer 10.05.2016 / 19:03

2 respostas

6

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.

    
por Yttrill 13.09.2016 / 11:52
0

Vá para tty1 pressionando: CTRL+ALT+F1

Limpe o gcc-5.3.1 usando isto:

sudo apt-get purge gcc-5.3.1*

E instale o gcc-4.9.3 usando isto:

sudo apt-get install gcc-4.9.3

Nota: isso requer conexão com a Internet!

    
por Eofla 10.05.2016 / 19:07

Tags