用 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_ &amp;&amp; ./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++版本,默认使用老版本编译)

Linux下g++编译thread出错的的解决方法

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

g++ 使用 -Wpedantic 选项编译 C++11:是不是有一个选项可以仅禁用有关未命名结构的警告?