如何在Mac Terminal中使用C ++ 11支持编译C ++


69

我想在Mac Terminal中编译C ++ 11源代码,但失败了。我试过g++ -std=c++11g++ -std=c++0xg++ -std=gnu++11g++ -std=gnu++0x,但毫无效果。终端总是读unrecognized command line option。但是,g++ -std=gnu类似的东西工作正常(当然,C ++ 11源代码无法通过)。

我应该使用哪个选项来打开C ++ 11支持?

顺便说一句,我正在使用的命令行工具已安装在Xcode中,并且我很确定它们是最新的。


1
Xcode随附的GCC不是最新的,实际上它是古老的。尝试clang++

@ H2CO3酷,完美运行。谢谢。但是,clang++警告我C ++ 11功能...是否可以关闭这些警告?
13年

使用该-w选项可以关闭所有警告。

要使用的调试器是lldb
edW '16

Answers:


103

正如其他人指出的那样,您应该使用clang++而不是g++。另外,您应该使用libc ++库而不是默认的libstdc ++。libstdc ++包含的版本很旧,因此不包括C ++ 11库功能。

clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp

如果尚未安装Xcode的命令行工具,则可以运行编译器和其他工具,而无需使用该xcrun工具。

xcrun clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp

另外,如果有特定的警告要禁用,您可以将其他标志传递给编译器来这样做。在警告消息的末尾,它将显示将启用警告的最具体的标志。要禁用该警告,请no-在警告名称之前添加。

例如,您可能不想要c ++ 98兼容性警告。在这些警告的末尾会显示该标志,-Wc++98-compat并通过禁用它们-Wno-c++98-compat


4
刚刚测试了你说的话。事实上,一个简单的std::array敲默认libstdc++了。
13年

是的,std::is_heap()如果不进行编译则存在问题-stdlib=libc++
拉子(Shiraz)2015年

我还必须:-mmacosx-version-min = 10.7
brianray

26

XCode在编译时使用clangclang++而不使用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扩展(也使用C ++ 11),则可以使用-std=gnu++11代替-std=c++11,它将打开C ++ 11模式并保持启用的GNU扩展。


大。非常感谢你。
13年

11
不知道-1的含义是什么...如果是因为我遗漏了评论-stdlib=c++,那就太好了,这样我可以更快地解决它!
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.