2013-01-09 407 views
51

我想在Mac Terminal中编译C++ 11源代码但失败。我试过g++ -std=c++11g++ -std=c++0x,g++ -std=gnu++11g++ -std=gnu++0x,但没有任何工作。终端总是阅读unrecognized command line option。然而,g++ -std=gnu和类似的东西很好(当然C++ 11源代码无法通过)。如何在Mac终端中使用C++ 11支持编译C++

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

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

+1

Xcode附带的GCC是**不**最新的,实际上它是古老的。试试'clang ++'。 – 2013-01-09 05:39:20

+0

@ H2CO3清凉,工作完美。谢谢。然而,'铿锵++'警告我C++ 11的功能...任何选项来关闭这些警告? – 4ae1e1

+0

使用'-w'选项关闭所有警告。 – 2013-01-09 05:53:58

回答

79

正如其他人指出,你应该使用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

+0

感谢您的额外信息! – 4ae1e1

+3

刚刚测试了你说的话。事实上,一个简单的'std :: array'将默认的'libstdC++'敲出。 – 4ae1e1

+0

是否在编译'std :: is_heap()'时没有'-stdlib = libC++'' – shiraz

20

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扩展功能。

+0

太棒了。非常感谢你。 – 4ae1e1

+8

不知道-1的用途是什么......如果是因为我遗漏了'-stdlib = C++',它会很高兴有一个评论,所以我可以更快地修复它! – Cornstalks