获取 C++11 - 兼容编译器

getting c++11 - compliant compiler

本文关键字:编译器 C++11 获取      更新时间:2023-10-16

这一切看起来都是一团糟。
我想要的只是一个实现 C++11 的编译器,所以我可以使用 <chrono> .但我从一开始就很困惑。

目前,我通过调用 G++ 来构建程序,但是当我通过 $ g++ -v 检查版本时,我得到:

gcc 版本 4.2.1(基于 Apple Inc. build 5658)(LLVM build 2336.11.00)

这是怎么回事?我使用的是 G++ 吗?海湾合作委员会?唰?我什至不知道。它们是一回事吗?

所以现在我正在尝试通过 gnu.org 构建和下载GCC 4.7,但我不知道任何指南在说什么。我从未见过这么多我不知道的事情的首字母缩略词。

为什么这么复杂?所有这些版本是怎么回事,其中一些只实现了 C++11 的某些部分,而没有实现其他部分?

这是OS X上的情况。

默认情况下安装了两个C++编译器。

[5:49pm][wlynch@watermelon ~] g++ --version
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
[5:49pm][wlynch@watermelon ~] clang++ --version
Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)

G++运行的是llvm-gcc,它是gcc前端,然后是llvm后端。

Clang++ 正在运行 Clang,它是 clang 前端,然后是 llvm 后端。

如果您希望在 OS X 上使用 C++11 编译器而不安装其他软件包,您唯一的选择就是使用 clang 编译器。

所需的标志是:

clang++ -stdlib=libc++ -std=gnu++11

为了描述我传递的两个标志:

  • -stdlib=libc++使用 libc++ 标准库,而不是 GNU libstdc++。在OS X上,libc++版本支持c ++ 11。gnu libstdc++ 没有。
  • -std=gnu++11告诉编译器支持 C++11 代码功能,如 lambda 和枚举类。你也可以传递-std=c++11,这是类似的,但不能启用一些通常期望的GNU扩展。
OS X

10.9 更新:从 OS X Mavericks 开始,g++ 和 clang++ 实际上都在使用 clang。唯一的区别是,g++将意味着-stdlib=libstdc++,而clang++将意味着-stdlib=libc++。所以,在小牛队,如果你想使用C++11,你可以遵循上面的建议,或者只是做:

clang++ -std=gnu++11
OS X

10.10 更新:从 OS X Yosemite 开始,g++ 仍然是伪装的。但是,默认情况下都不再使用 libstdc++。两者都在libc ++上。

听起来你有Xcode 4.6和最新的命令行工具。这是来自发行说明:

Important: The LLVM GCC compiler does not include the latest Objective-C and 
C++11 features. Xcode 4.6 is the last major Xcode release which includes the 
LLVM GCC compiler and the GDB debugger. Please migrate your projects to use the 
LLVM compiler and LLDB debugger…

我认为您想改用c++

$ c++ -v
Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.2.0
Thread model: posix

@sharth: 自XCode 5.0发布以来,Mac上的情况发生了相当大的变化。 clang/clang++ 是默认的 C/C++ 编译器。我相信它们对应于LLVM版本3.3,并且这个版本的clang++完全符合C++11标准。请注意,clang++ --version将在Mac上返回类似"5.0.x"的版本号,但这是指XCode版本。

几个月来,我一直在 C++11 项目中使用 Apple clang++,到目前为止,我还没有看到任何问题。绝对没有理由在Mac上使用任何其他C++编译器:-)

GCC/G++的情况并不那么乐观。最新版本的 G++ (4.8.2) 确实实现了大部分 C++11 标准,但标准库不兼容!例如,std::regex 不是在 libstdc++ 中实现的,但只有当你运行代码并且正则表达式构造函数抛出 -s std::regex_error时,你才会发现这一点。 (我在尝试将上述小项目移植到 Linux 时发现了这一点。社区认为,G++ 的 4.9 版本将完全符合要求。在此之前,您还应该在Linux上使用Clang编译器。

我无法访问最新的英特尔C++编译器套件,因此不知道icpc的合规性如何。