我想在Mac终端中编译C++11源代码,但是失败了。我尝试过使用g++ -std=c++11
、g++ -std=c++0x
、g++ -std=gnu++11
和g++ -std=gnu++0x
,但都没有成功。终端始终显示未识别的命令行选项
。然而,像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
。
std::array
就能打败默认的 libstdc++
。 - 4ae1e1std::is_heap()
时遇到了问题,没有使用-stdlib=libc++
。 - shirazXCode在编译时使用clang
和clang++
,而不是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 扩展可用。
-stdlib=c++
,那么留下一条评论让我更快地修复它会更好!请问需要翻译其他内容吗? - Cornstalks
clang++
。 - user529758clang++
警告我使用了C++11的特性...有什么选项可以关闭这些警告吗? - 4ae1e1-w
选项关闭所有警告。 - user529758