GNU/Linux >> Znalost Linux >  >> Ubuntu

Jak bych měl řešit nekompatibilitu Abi mezi Gcc-4.9 a Gcc-5?

Nedávno jsem upgradoval svůj dev stroj na Ubuntu 16.04 (čerstvá instalace, vymazáno 14.04)

Výchozí verze gcc je gcc-5.3.1 .

Problém, který mám, je, že knihovna dodaná dodavatelem je vytvořena pouze pomocí gcc-4.9, která není kompatibilní s gcc-5.

Požádal jsem dodavatele o poskytnutí nové verze knihovny, ale je nepravděpodobné, že k tomu v dohledné době dojde.

Mezitím jsem nainstaloval gcc-4.9.3 z repozitářů balíčků Ubuntu.

Nyní mám nainstalovaný gcc-4.9 i gcc-5:

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

Pokusil jsem se vytvořit náš zdroj s gcc-4.9, ale nyní narážím na stejné problémy s ABI, ale jdu jinou cestou.

Problém, který mám, je, že máme spoustu závislostí, které bychom obvykle instalovali z distro balíčků

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

I když mohu nakonfigurovat svou sestavu tak, aby používala gcc-4.9

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

Nyní dostávám chyby linkeru při odkazování na libtcmalloc_minimal.a , libprotobuf.a atd.

Takže dalším krokem, který jsem zkusil, bylo odstranit všechny závislosti nainstalované z repozitářů distribuce a začít vytvářet závislosti ze zdroje.

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

Problém je v tom, že začínám sjíždět králičí norou. Každá závislost má další závislosti a já si nejsem jistý, kde to skončí.

Druhou možností je přejít zpět na Ubuntu 14.04 nebo nějakou verzi, která se dodává s gcc-4.9 místo gcc-5.

Než jsem zkusil tuto turmonukleární možnost, přemýšlel jsem, jestli existuje lepší způsob, jak to udělat?

Možná je možné instalovat z repozitářů vytvořených pomocí gcc-4.9 nebo nějakým jiným způsobem?

Přijatá odpověď:

Problém, který máte, souvisí se standardem C++ 11, který vyžaduje jinou implementaci typů řetězců (a seznamu) C++. Kvůli kompatibilitě g++5.2 a vyšší standardně kompilují nový typ vyhovující C++11 (bez ohledu na to, zda zadáte -std=c++11), ale můžete nastavit makro

-D_GLIBCXX_USE_CXX11_ABI=0

vrátit se ke starému typu řetězce C++. Nová implementace libstdc++ obsahuje obojí ABI. Takže pokud máte binární soubory, které musíte propojit se starým nevyhovujícím ABI, musíte nastavit makro výše na kompilacích g++. To by mělo vytvořit binární soubory kompatibilní se starým ABI.

Související:Jak získat rozlišení 2560×1440 ve VirtualBoxu na Macu?

Bohužel pokud používáte knihovny z jiného OS než C++ Standard Libraries, pak pokud tyto knihovny nejsou víceobloukové ve smyslu poskytování všech funkcí, které se liší podle ABI v obě ABI, pak jste v háji, protože pravděpodobně budou mít pouze nové ABI.

Po tom, co jsem řekl, že mám problém na starém Ubuntu se stahováním nedůvěryhodného moderního g++, které prostě odmítá vytvořit nové ABI. Zdá se tedy, že backport z ppa:ubuntu-toolchain-r/test je ve skutečnosti vážně poškozen, protože odmítá vytvářet binární soubory podle nového ABI.

Základem je každopádně, když propojíte, všechno musí být buď staré ABI, nebo nové ABI. Následující informace prozradí, které používáte:

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

Pokud ano

std::basic_string<char, ....

v něm je to staré ABI. Pokud má

std::__cxx11::basic_string<char, ...

v něm je to nové ABI.


Ubuntu
  1. Jak zacházet s dynamickými a statickými knihovnami v Linuxu

  2. Jak najít/grep, co je mezi String1 a String2?

  3. Jak nainstalovat Gcc-5.3 na Ubuntu 16.04?

  1. Co je kurátorství obsahu a jak byste to měli dělat?

  2. Jak přepínat mezi tty a xorg session

  3. 8G RAM a SSD - jak velký by měl být swap?

  1. Jak nainstalovat PHP 7.4 a 8.0 na Ubuntu 18.04 nebo 20.04

  2. Linux – Jak přepínat mezi relací Tty a Xorg?

  3. Jak sdílet soubory mezi Ubuntu a Mac OS X