Как мне справиться с несовместимостью ABO между gcc-4.9 и gcc-5?

Я недавно обновил свой компьютер до Ubuntu 16.04 (новая установка, стер 14.04).

Версия gcc по умолчанию - gcc-5.3.1.

У меня проблема в том, что поставляемая поставщиком библиотека создается только с использованием gcc-4.9, который не совместим с gcc-5.

Я попросил продавца предоставить новую версию библиотеки, но вряд ли это произойдет в ближайшее время.

Тем временем я установил gcc-4.9.3 из репозитория пакетов Ubuntu.

Теперь у меня установлены и gcc-4.9, и 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

Я пытался собрать наш исходный код с помощью gcc-4.9, но теперь я сталкиваюсь с теми же проблемами ABI, но собираюсь Другой путь.

У меня проблема в том, что у нас есть куча зависимостей, которые мы обычно устанавливаем из пакетов дистрибутивов

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

, хотя я могу настроить свою сборку на использование gcc-4.9

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

Теперь я получаю ошибки компоновщика при связывании с libtcmalloc_minimal.a, libprotobuf.a и т. Д.

Итак, следующим шагом, который я попытался, было удалить все зависимости, установленные из репозиториев дистрибутивов, и начать сборку зависимостей из исходного кода.

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

Проблема в том, что я начинаю спускаться по кроличьей норе. У каждой зависимости есть свои зависимости, и я не уверен, где она закончится.

Другой вариант - вернуться к Ubuntu 14.04 или к другой версии, которая поставляется с gcc-4.9 вместо gcc-5.

Перед тем, как я попробую этот вариант с Turmonuclear, мне было интересно, есть ли лучший способ сделать это?

Может быть, возможно установить из репозиториев, созданных с помощью gcc-4.9, или каким-либо другим способом?

4
задан 10 May 2016 в 20:03

3 ответа

Проблема, которую Вы имеете, связана с C++ 11 стандартов, требующих другой реализации строки C++ (и список) тип (типы). Для совместимости, g ++ 5.2 и выше компиляций новый C++ 11 совместимых типов по умолчанию, (указываете ли Вы-std=c ++ 11), но можно установить макрос

-D_GLIBCXX_USE_CXX11_ABI=0

вернуться к старому строковому типу C++. Новые libstdc ++ реализация содержат обоих ABIs. Таким образом, если у Вас есть двоичные файлы, необходимо связаться против со старым несовместимым ABI, необходимо установить макрос выше на g ++ компиляции. Это должно произвести двоичные файлы, совместимые со старым ABI.

К сожалению, если Вы пользуетесь библиотеками от ОС кроме Библиотек Стандарта C++, затем если эти библиотеки не являются мультидугой в смысле обеспечения всех функций, которые отличаются ABI по обоим ABI, затем Вы завинчены, потому что у них, вероятно, только будет новый ABI.

Сказав, что у меня есть проблема на старой Ubuntu, загружающей недоверяемый современный g ++, который просто отказывается производить новый ABI. Таким образом, это кажется тем бэкпортом от ppa:ubuntu-toolchain-r/test на самом деле плохо повреждается, потому что это отказывается производить двоичные файлы согласно новому ABI.

Во всяком случае нижняя строка - когда Вы соединяете все, должен или быть старый ABI или новый ABI. Следующее скажет, который Вы используете:

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

Если это имеет

std::basic_string<char, ....

в нем он - старый ABI. Если это имеет

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

в нем он - новый ABI.

9
ответ дан 11 May 2016 в 06:03
  • 1
    Слишком сложный для меня. Я don' t знают Уэйленд, и при этом я не знаю, как переключиться на " Ubuntu на Xorg". можно ли рекомендовать другой программе работать с разделами под 17,10? – Ulrich 23 October 2017 в 00:05

Перейдите к tty1 путем нажатия: CTRL+ALT+F1

Чистка gcc-5.3.1 использующий это:

sudo apt-get purge gcc-5.3.1*

И установка gcc-4.9.3, использующий это:

sudo apt-get install gcc-4.9.3

Примечание: Это требует Интернет-соединения!

0
ответ дан 11 May 2016 в 06:03
  • 1
    @Ulrich - просто тип xhost +si:localuser:root в терминале прежде, чем запустить gparted – ravery 23 October 2017 в 00:16

Хорошо использовать-d_glibcxx_use_cxx11_abi=0., но можно также использовать эту опцию g ++, который может даже быть лучше

       -fabi-version=n
           Use version n of the C++ ABI.  The default is version 0.

           Version 0 refers to the version conforming most closely to the C++ ABI specification.  Therefore, the ABI obtained using version 0 will change in different versions of G++ as ABI bugs are
           fixed.

           Version 1 is the version of the C++ ABI that first appeared in G++ 3.2.

           Version 2 is the version of the C++ ABI that first appeared in G++ 3.4, and was the default through G++ 4.9.

           Version 3 corrects an error in mangling a constant address as a template argument.

           Version 4, which first appeared in G++ 4.5, implements a standard mangling for vector types.

           Version 5, which first appeared in G++ 4.6, corrects the mangling of attribute const/volatile on function pointer types, decltype of a plain decl, and use of a function parameter in the
           declaration of another parameter.

           Version 6, which first appeared in G++ 4.7, corrects the promotion behavior of C++11 scoped enums and the mangling of template argument packs, const/static_cast, prefix ++ and --, and a class
           scope function used as a template argument.

           Version 7, which first appeared in G++ 4.8, that treats nullptr_t as a builtin type and corrects the mangling of lambdas in default argument scope.

           Version 8, which first appeared in G++ 4.9, corrects the substitution behavior of function types with function-cv-qualifiers.

           Version 9, which first appeared in G++ 5.2, corrects the alignment of "nullptr_t".

           See also -Wabi.

       -fabi-compat-version=n
           On targets that support strong aliases, G++ works around mangling changes by creating an alias with the correct mangled name when defining a symbol with an incorrect mangled name.  This switch
           specifies which ABI version to use for the alias.

           With -fabi-version=0 (the default), this defaults to 2.  If another ABI version is explicitly selected, this defaults to 0.

           The compatibility version is also set by -Wabi=n.

0
ответ дан 1 December 2019 в 09:03

Другие вопросы по тегам:

Похожие вопросы: