用 g++ 编译 C++11
Posted
技术标签:
【中文标题】用 g++ 编译 C++11【英文标题】:Compiling C++11 with g++ 【发布时间】:2012-05-08 23:16:42 【问题描述】:我正在尝试将我的 C++ 编译器更新为 C++11。
我搜索了一下,得出的结论是我必须使用标志-std=c++0x
或-std=gnu++0x
,但我对标志的了解并不多。谁能帮我? (我使用的是 Ubuntu 12.04。)
这是我尝试使用 C++11 中包含的库(即数组)时从编译器得到的错误:
#include <array>
#include <iostream>
int main()
std::array<int, 3> arr = 2, 3, 5;
...
此文件需要编译器和库支持即将推出的 ISO C++ 标准 C++0x。此支持目前处于试验阶段,必须使用 -std=c++0x 或 -std=gnu++0x 编译器选项启用。
【问题讨论】:
在最新版本中,您可能必须改用-std=c++11
。不过,也许两者都是允许的。
这错过了很多上下文。显示您尝试过的完整命令(甚至可能是您尝试编译的示例代码),以及实际失败的内容。
@classdaknok_t: 两者都应该被允许,ubuntu 12.04 也默认提供g++-4.6
(仅支持-std=c++0x
)
在g++
之后添加标志,例如g++ -std=c++0x _filename_ && ./a.out
.
看到这篇文章,搜索标题为错误消息。我正在做一个 QMAKE 项目,我的解决方案是将 CONFIG += c++11 添加到 .pro 文件中。
【参考方案1】:
标志(或编译器选项)只是传递给编译器可执行文件的普通命令行参数。
假设您从命令行(终端)调用 g++:
$ g++ -std=c++11 your_file.cpp -o your_program
或
$ g++ -std=c++0x your_file.cpp -o your_program
如果上述方法不起作用。
【讨论】:
别忘了把-Wall -g
放在g++
之后
@BasileStarynkevitch:我也会添加-Werror
,在开始项目时没有理由不添加。
更好的 C++11 支持值得商榷,而现在更好的诊断看起来并没有那么好(描述它们的 Clang 页面使用的是古老的 GCC 4.2)gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
有谁知道 C++ 编译器是否/何时会默认支持 C++11 标准,即没有标志?
如果您还不知道,在 Visual C++ 中只需使用 VC11 (Visual Studio 2012) 或更高版本即可拥有 C++11 功能【参考方案2】:
您可以通过命令查看您的g++
:
which g++
g++ --version
这会告诉你它当前指向的是哪个编译器。
要切换到g++
4.7(假设你已经安装在你的机器上),运行:
sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/gcc-4.6 60 auto mode
1 /usr/bin/gcc-4.6 60 manual mode
* 2 /usr/bin/gcc-4.7 40 manual mode
然后选择2
作为选择(我的机器已经指向g++
4.7,所以*)
切换编译器后,再次运行g++ --version
以检查切换是否正确。
现在用
编译你的程序g++ -std=c++11 your_file.cpp -o main
【讨论】:
可能值得一提的是,像 g++ 4.4 这样的版本可能太旧而无法执行某些功能,因此升级是必要的。升级将取决于您的系统,我会避免自己编译 g++ 并替换系统的编译器以供参考的方法【参考方案3】:您可以参考以下link 以了解哪个版本的编译器支持哪些功能。它在现代编译器中提供了详尽的功能支持列表。似乎 GCC 非常严格地遵循标准并且在任何其他编译器之前实现。
关于你的问题,你可以编译使用
g++ source_file.cpp -o executable_name -std=c++11
用于 C++11
g++ source_file.cpp -o executable_name -std=c++14
用于 C++14
g++ source_file.cpp -o executable_name -std=c++17
用于 C++17
g++ source_file.cpp -o executable_name -std=c++2a
对于 C++20,尚不支持 C++20 的所有功能。请参阅此link 了解 GCC 中的功能支持列表。
列表变化很快,如果您正在等待某个特定功能得到支持,请密切关注列表。
【讨论】:
【参考方案4】:您的 Ubuntu 肯定有足够新的 g++
版本。要使用的标志是-std=c++0x
。
【讨论】:
怎么说呢,他用的是ubuntu?。只是想知道。 @Shravan40 OP 在问题中明确表示I'm using Ubuntu 12.04.
。【参考方案5】:
如果您想保留 GNU 编译器扩展,请使用 -std=gnu++0x 而不是 -std=c++0x。这是手册页中的引述:
编译器可以接受几个基本标准,例如 c89 或 c++98, 以及这些标准的 GNU 方言,例如 gnu89 或 gnu++98。经过 指定一个基本标准,编译器将接受所有程序 遵循该标准以及使用不遵循该标准的 GNU 扩展 反驳它。例如,-std=c89 关闭 GCC 的某些功能 与 ISO C90 不兼容的,例如“asm”和“typeof” 关键字,但不是其他没有意义的 GNU 扩展 ISO C90,例如省略“?:”表达式的中间项。在 另一方面,通过指定标准的 GNU 方言,所有功能 编译器支持已启用,即使这些功能更改了 基本标准的含义和一些严格遵守的程序可能 被拒绝。 -pedantic 使用特定标准来识别 给定该版本的标准,哪些功能是 GNU 扩展。 例如-std=gnu89 -pedantic 会警告 C++ 风格 // cmets,而 -std=gnu99 -pedantic 不会。
【讨论】:
除了二进制?:
操作符之外,你还能得到什么?唯一想到的其他扩展,结构表达式,被 C++11 列表初始化所取代。无论如何,这句话主要与 C 相关,而不是 C++。【参考方案6】:
对 ISO C++11 使用 -std=c++11
编译器标志。
有关 C++ 编译器标志和选项的更多详细信息,check this。
【讨论】:
这个答案是多余的,被接受的答案。以上是关于用 g++ 编译 C++11的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio C++11g 编译错误 - 初始化程序太多
linux如何查看编译器支持的C++版本(支持C++11支持C++14支持C++17支持C++20)(编译时不指定g++版本,默认使用老版本编译)
linux如何查看编译器支持的C++版本(支持C++11支持C++14支持C++17支持C++20)(编译时不指定g++版本,默认使用老版本编译)