如何在Mac终端上编译支持c++ 11的c++

How to compile C++ with C++11 support in Mac Terminal

本文关键字:c++ 支持 编译 Mac 终端      更新时间:2023-10-16

我想在Mac终端中编译c++ 11源代码,但失败了。我尝试了g++ -std=c++11, g++ -std=c++0x, g++ -std=gnu++11g++ -std=gnu++0x,但没有任何效果。终端总是读取unrecognized command line option。然而,g++ -std=gnu和类似的东西工作得很好(当然c++ 11源代码不能通过)。

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

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

正如其他人指出的那样,您应该使用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禁用它们。

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