Когда необходимо использовать флаг -stdlib=libstdc++?

Когда необходимо использовать флаг -stdlib=libstdc++ для компилятора и компоновщика при компиляции с помощью gcc?

Компилятор автоматически использует libstdc++?

Я использую gcc4.8.2 в Ubuntu 13.10, и я хотел бы использовать стандарт С++ 11. Я уже передаю -std=c++11 компилятору.


person Raymond Valdes    schedule 04.11.2013    source источник
comment
Э-э, старый вопрос, который я знаю, но -stdlib=libstdc++ не является допустимым флагом gcc. Его можно использовать в MacOS только потому, что g++ в MacOS на самом деле clang++.   -  person davmac    schedule 08.01.2018


Ответы (3)


В Linux: как правило, все распространенные дистрибутивы Linux по умолчанию используют libstdc++, а все современные версии GCC поставляются с libstdc++, поддерживающим C++11. Если вы хотите скомпилировать код С++ 11 здесь, используйте один из:

  • g++ -std=c++11 input.cxx -o a.out (обычно компилятор GNU)
  • g++ -std=gnu++11 input.cxx -o a.out

В OS X до Mavericks: g++ на самом деле был псевдонимом для clang++, а старая версия Apple libstdc++ использовалась по умолчанию. Вы можете использовать libc++ (который включает поддержку библиотеки c++11), передав -stdlib=libc++. Если вы хотите скомпилировать код С++ 11 здесь, используйте один из:

  • g++ -std=c++11 -stdlib=libc++ input.cxx -o a.out (лязг, а не компилятор GNU!)
  • g++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out (лязг, а не компилятор GNU!)
  • clang++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
  • clang++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out

В OS X, начиная с Mavericks: по умолчанию используется libc++. Вы можете использовать старую версию Apple libstdС++ (которая не включает поддержку библиотеки С++11), передав -stdlib=libstdc++

  • clang++ -std=c++11 input.cxx -o a.out
  • clang++ -std=gnu++11 input.cxx -o a.out
person Bill Lynch    schedule 04.11.2013
comment
Если я правильно понимаю, то libstdc++ поддерживает c++11 для Linux, но не OSX10.9. -› код c++11 на osx10.9 должен быть скомпилирован/слинкован с -stdlib=libc++. - person Raymond Valdes; 04.11.2013
comment
@raymondvaldes: Это правильно. Apple отказывается распространять новые версии libstdc++, содержащие поддержку C++11. - person Bill Lynch; 05.11.2013
comment
Могу ли я использовать libstdc++ с clang (не clang++)? - person hithwen; 08.02.2014
comment
@hithwen: libstdc++ — это стандартная библиотека C++. Не имеет особого смысла использовать его с clang вместо clang++. - person Bill Lynch; 08.02.2014
comment
@hithwen: я не думаю, что ваша проблема связана с этим ответом. Я бы рекомендовал создать новый вопрос, чтобы задать это. - person Bill Lynch; 09.02.2014
comment
В чем разница между libc++ и libstdc++? Являются ли они обе стандартной библиотекой времени выполнения С++? - person nn0p; 27.11.2016
comment
@nn0p да. Это две разные реализации стандартной библиотеки С++. Один от людей gcc, один от людей llvm. - person Bill Lynch; 27.11.2016
comment
Чтобы избежать глупой чепухи с g++ и gcc в OS X, вероятно, будет экономить время, если явно использовать g++-mp-9 (или любой вариант установки GCC, который был выполнен) во время компиляции, если это цель - и в этом случае настоящий Библиотека GNU libstdc++ будет использоваться настоящим компилятором GNU G++, а не старой библиотекой OS X libstdc++ (или более новой libc++) на поддельной прокладке совместимости g++. - person user2864740; 12.10.2019

Когда необходимо использовать флаг -stdlib=libstdc++ для компилятора и компоновщика при компиляции с помощью gcc?

Краткий ответ: никогда

Более длинный ответ: -stdlib — это флаг Clang, который не будет работать ни с одной версией GCC, когда-либо выпущенной. В Mac OS X иногда команды gcc и g++ на самом деле являются псевдонимами для Clang не GCC, а версия libstdc++, которую поставляет Apple, древняя (около 2008 г.), так что, конечно, это не поддерживает С++11. Это означает, что в OS X при использовании Clang, претендующего на статус GCC, вы можете использовать -stdlib=libc++ для выбора новой библиотеки Clang, совместимой с C++ 11, или вы можете использовать -stdlib=libstdc++ для выбора устаревшей версии до C++ 11. libstdc++, который принадлежит музею. Но в GNU/Linux gcc и g++ действительно являются GCC, а не Clang, поэтому вариант -stdlib вообще не будет работать.

Компилятор автоматически использует libstdc++?

Да, GCC всегда использует libstdc++, если вы не укажете ему не использовать стандартную библиотеку вообще с параметром -nostdlib (в этом случае вам нужно либо избегать использования каких-либо функций стандартной библиотеки, либо использовать -I и -L и -l флаги, чтобы указать на альтернативный набор заголовочных и библиотечных файлов).

Я использую gcc4.8.2 в Ubuntu 13.10, и я хотел бы использовать стандарт С++ 11. Я уже передаю -std=c++11 компилятору.

Вам не нужно делать ничего другого. GCC поставляется с собственной реализацией стандартной библиотеки C++ (libstdc++), которая разработана и протестирована вместе с самой GCC, поэтому версия GCC и версия libstdc++ совместимы на 100%. Если вы компилируете с -std=c++11, то это включает функции С++ 11 в компиляторе g++, а также функции С++ 11 в заголовках libstdС++.

person Jonathan Wakely    schedule 18.05.2018
comment
Я использовал clang в своем проекте, но для CI компилятор по умолчанию настроен на gcc. Так что это именно проблема, которая возникла. gcc не поддерживает -stdlib, поэтому CI всегда терпит неудачу - person tjysdsg; 12.05.2020

Компилятор автоматически использует libstdc++, если вы используете интерфейс g++, а не интерфейс gcc.

person Torsten Robitzki    schedule 04.11.2013
comment
Конечно. Просто для уточнения: ОП спрашивал при компиляции с помощью gcc?. Если кто-то запускает gcc для группы .o файлов, то, я думаю, предполагается, что это просто программы на C, и он не связан ни с чем на C++. Но если вы используете g++ (или если у вас есть какие-либо файлы cpp в командной строке gcc), то я думаю, что он поймет, что stdc++ должен быть включен. Но я не слишком уверен в этом. Это то, что вы говорите? - person Aaron McDaid; 04.11.2013
comment
Чтобы уточнить мой вопрос, когда я сказал gcc, я имел в виду коллекцию компилятора gnu (в целом). Поскольку я говорю о коде C++, я бы использовал внешний интерфейс g++. - person Raymond Valdes; 04.11.2013
comment
Вот это да. Этот не был очевиден. - person garyF; 07.11.2017
comment
@RaymondValdes, когда речь идет о целом, обычно говорят GCC, чтобы отличить его от программы драйвера gcc. - person Jonathan Wakely; 18.05.2018
comment
@Torsten, то, что вы имеете в виду, автоматически связывается с libstdc++, если вы используете g++, а не gcc. Если вы скомпилируете файл C++ (один с расширением, например, .cc или .C или .cpp) с помощью gcc, тогда он компилирует код с использованием внешнего интерфейса C++ и автоматически делает заголовки libstdc++ доступными через #include, точно так же, как при компиляции с g++ . Только шаг компоновки обрабатывает libstdc++ по-разному, в зависимости от того, используете ли вы gcc или g++. - person Jonathan Wakely; 18.05.2018