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

Posted

技术标签:

【中文标题】如何在 Mac 终端中使用 C++11 支持编译 C++【英文标题】:How to compile C++ with C++11 support in Mac Terminal 【发布时间】:2012-12-23 02:59:33 【问题描述】:

我想在 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 中,我很确定它们是最新的。

【问题讨论】:

Xcode 附带的 GCC 不是 最新的,实际上它是古老的。试试clang++ @H2CO3 酷,完美运行。谢谢。然而,clang++ 警告我 C++11 的特性...有什么选项可以关闭这些警告吗? 使用-w 选项关闭所有警告。 要使用的调试器是lldb 【参考方案1】:

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

【讨论】:

刚刚测试了你说的。事实上,一个简单的std::array 会淘汰默认的libstdc++ 是的,在没有 -stdlib=libc++ 的情况下编译 std::is_heap() 时出现问题 我还必须:-mmacosx-version-min=10.7【参考方案2】:

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

【讨论】:

不确定 -1 的用途...如果是因为我遗漏了 -stdlib=c++,如果能发表评论,我可以更快地修复它!

以上是关于如何在 Mac 终端中使用 C++11 支持编译 C++的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac OS X 终端上使用 make 编译 C 程序

如何在mac终端中运行c++程序

将 -std=c++11 设为 mac 终端的默认值

MAC中使用Vim和GCC编译C程序

linux如何查看编译器支持的C++版本(支持C++11支持C++14支持C++17支持C++20)(编译时不指定g++版本,默认使用老版本编译)

linux如何查看编译器支持的C++版本(支持C++11支持C++14支持C++17支持C++20)(编译时不指定g++版本,默认使用老版本编译)