12

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

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

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


这是怎么回事?我在使用 G++ 吗?海合会?LLVM?我什至不知道。它们是一样的吗?


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

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

4

3 回答 3

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++ 上。

于 2013-02-01T23:51:46.977 回答
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
于 2013-02-01T23:42:22.650 回答
0

@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++ 中没有实现,但只有在运行代码并且正则表达式构造函数抛出std::regex_error-s 时才会发现这一点。(我在尝试将上述小项目移植到 Linux 时发现了这一点。)社区相信 G++ 4.9 版本将完全符合要求。在此之前,您也应该在 Linux 上使用 Clang 编译器。

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

于 2014-01-30T16:41:38.513 回答