如何在Mac终端中编译支持C++11的C++代码

77

我想在Mac终端中编译C++11源代码,但是失败了。我尝试过使用g++ -std=c++11g++ -std=c++0xg++ -std=gnu++11g++ -std=gnu++0x,但都没有成功。终端始终显示未识别的命令行选项。然而,像g++ -std=gnu这样的选项运行良好(当然,C++11源代码无法通过)。

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

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


2
Xcode附带的GCC并不是最新版本,事实上它已经过时了。建议尝试使用clang++ - user529758
@H2CO3 很酷,完美地工作了。谢谢。不过,clang++警告我使用了C++11的特性...有什么选项可以关闭这些警告吗? - 4ae1e1
1
使用 -w 选项关闭所有警告。 - user529758
要使用的调试器是lldb。 - JayS
2个回答

115

正如其他人所指出的那样,你应该使用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++ - 4ae1e1
编译std::is_heap()时遇到了问题,没有使用-stdlib=libc++ - shiraz
我还需要加上以下参数:-mmacosx-version-min=10.7 - brianray

28

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 扩展可用。


11
不确定为什么要打-1... 如果是因为我忘了加上-stdlib=c++,那么留下一条评论让我更快地修复它会更好!请问需要翻译其他内容吗? - Cornstalks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接