Как скомпилировать С++ с поддержкой С++ 11 в Mac Terminal
Я хотел скомпилировать исходный код С++ 11 в Mac Terminal, но не удалось. Я пробовал g++ -std=c++11
, g++ -std=c++0x
, g++ -std=gnu++11
и g++ -std=gnu++0x
, но ничего не работало. Терминал всегда читается unrecognized command line option
. Тем не менее, g++ -std=gnu
и такие вещи отлично работали (конечно, исходный код С++ 11 не мог пройти).
Какую опцию я должен использовать для включения поддержки С++ 11?
Кстати, инструмент командной строки, который я использую, установлен в Xcode, и я уверен, что они обновлены.
Ответы
Ответ 1
Как указывали другие, вы должны использовать clang++
, а не g++
. Кроме того, вы должны использовать библиотеку libС++ вместо стандартного libstdС++; Включенная версия libstdС++ довольно старая и поэтому не включает в себя возможности библиотеки С++ 11.
clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp
Если вы не установили инструменты командной строки для Xcode, вы можете запустить компилятор и другие инструменты, не делая этого, используя инструмент xcrun
.
xcrun clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp
Также, если есть специальное предупреждение, которое вы хотите отключить, вы можете передать дополнительные компиляторы для этого. В конце предупреждающих сообщений отображается наиболее конкретный флаг, который будет включать предупреждение. Чтобы отключить это предупреждение, вы добавляете no-
к имени предупреждения.
Например, вам, вероятно, не нужны предупреждения совместимости С++ 98. В конце этих предупреждений он показывает флаг -Wc++98-compat
и отключает их, вы передаете -Wno-c++98-compat
.
Ответ 2
XCode использует clang
и clang++
при компиляции, а не g++
(если вы не настроили какие-либо вещи). Вместо этого попробуйте:
$ cat t.cpp
#include <iostream>
int main()
{
int* p = nullptr;
std::cout << p << std::endl;
}
$ clang++ -std=c++11 -stdlib=libc++ t.cpp
$ ./a.out
0x0
Спасибо bames53 за то, что указали, что я оставил -stdlib=libc++
.
Если вы хотите использовать некоторые расширения GNU (а также использовать С++ 11), вы можете использовать -std=gnu++11
вместо -std=c++11
, который включит режим С++ 11, а также включит расширения GNU.