获得符合c ++ 11的编译器

时间:2013-02-01 23:33:10

标签: c++ macos c++11 gnu toolchain

这一切似乎都是一个巨大的混乱 我想要的只是一个实现C ++ 11的编译器,所以我可以使用<chrono>。但是我从一开始就很困惑。

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

  

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


这是怎么回事?我使用的是G ++吗? GCC? LLVM?我甚至不知道。它们是一样的吗?


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

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

3 个答案:

答案 0 :(得分:22)

以下是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代码功能,如lambdas和enum类。您也可以传递类似的-std=c++11,但不会启用一些常用的gnu扩展。

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

clang++ -std=gnu++11

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

答案 1 :(得分:0)

听起来你有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

答案 2 :(得分:0)

@sharth:自XCode 5.0发布以来,Mac上的情况发生了很大变化。 clang / clang ++是默认的C / C ++编译器。它们对应于我认为的LLVM版本3.3,这个版本的clang ++是fully C++11-compliant。请注意,clang++ --version将在Mac上返回类似“5.0.x”的版本号,但它指的是XCode版本。

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

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

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