Это будет зависеть от вашей 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 *