_GLIBCXX_USE_CXX11_ABI отключен на RHEL6 и RHEL7? - PullRequest
0 голосов
/ 13 июня 2018

У меня gcc 5.2.1 на RHEL6 и RHEL7, и похоже, что _GLIBCXX_USE_CXX11_ABI отключается.Это не работает, даже если я вручную запускаю -D_GLIBCXX_USE_CXX11_ABI=1 -std=c++14.Это означает, что я не получу небольшую функцию оптимизации строк.Например, вывод следующего кода всегда имеет 8 и «микро не установлено».Для SSO размер std :: string должен быть не менее 16, если мы посмотрим на код биты / basic_string.h.Любой обходной путь?

#include <string>
#include <iostream>

int main()
{
    std::cout << sizeof(std::string) << std::endl;

#if _GLIBCXX_USE_CXX11_ABI
    std::cout << "macro set" << std::endl;
#else
    std::cout << "macro not set" << std::endl;
#endif

}

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

bugzilla.redhat имеет ответ ниже

Jakub Jelinek 2018-02-19 06:08:00 EST

Мы очень старались, ноэто невозможно поддерживать ни на RHEL6, ни на RHEL7, поэтому он принудительно отключен.Он будет работать в RHEL8 (и там будет по умолчанию).

0 голосов
/ 13 июня 2018

Это будет зависеть от вашей libstdc++ версии, убедитесь, что ваши пути include / link / runtime правильные.Найдите в своей системе этот макрос, а затем используйте его, просто убедитесь, что вы ссылаетесь на правильные библиотеки stdlib / abi.

Если у вас его нет, вы всегда можете создать его самостоятельно, однако будьте осторожны, еслиостальные программы, которые у вас есть, используют старый ABI, они не будут работать с вашим новым libstdc++.


Редактировать: Подумав об этом, вы указали правильный флаг -std= для g++?Вы пробовали -std=gnu11?Это может быть так же тривиально, как это.Если нет, то читайте дальше.Не указывайте это определение вручную, вы нарушите совместимость ABI с вашим libstdc++, что приведет к каскадам чудесных сбоев.Единственный раз, когда вы можете указать такие вещи, - это когда вы создаете stdlib самостоятельно.


В остальном это немного излишне, но объясняет, как построить и / или выбрать какойstdlib, который вы хотите использовать.

У меня есть похожая проблема при использовании ABI версии 2 libc++, где все, что связывается с ним, должно быть перестроено с правильными заголовками и, следовательно, с правильным ABI (такие вещи, как оптимизация небольших строк является одним из них).

Например, при создании объектов C ++ я использую следующие флаги, чтобы указать расположение пути к пользовательскому пути заголовка stdlib, вместо того, чтобы использовать предоставленный ОС (я использую Clang, но принцип аналогичен):

-nostdinc++ -I/usr/local/sdk/llvm.6.0.1/include/c++/v1/

И затем на этапе компоновки я использую относительный путь поиска во время выполнения $ORIGIN, поскольку на производственных машинах стандартная библиотека установлена ​​в более подходящем месте, но вы можете указать фиксированную для того, что вам нужно.Вы также хотите убедиться, что компоновщик может найти соответствующий stdlib во время статической компоновки с -L.

-Wl,-rpath,'$ORIGIN/../lib' -L/usr/local/sdk/llvm.6.0.1/lib

Вам потребуется связать с -lstdc++ и -lsupc++ (порядок важен, если статическое связывание), если вы указали правильный путь поиска в библиотеке, статический компоновщик должен найти их, которыебиблиотека поддержки GCC / GNU C ++ stdlib и ABI.

Осторожно, если вы замените системную библиотеку libstdc + этим, все программы, связанные со старым макетом ABI, будут ломаться, если они динамически связаны, поэтому будьте осторожны.1037 *

...