获得 c++11 - 兼容的编译器

Posted

技术标签:

【中文标题】获得 c++11 - 兼容的编译器【英文标题】:getting c++11 - compliant compiler 【发布时间】:2013-01-17 09:19:33 【问题描述】:

这一切看起来都是一团糟。 我想要的只是一个实现 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 的某些部分而不是其他版本?

【问题讨论】:

看起来您使用的是 Mac。您可以使用MacPorts 安装现代版本的 GCC。从源代码编译 GCC 有点复杂,所以我想你会想要 MacPorts。 @SethCarnegie 谢谢!我以前点击安装。现在需要一本命令行命令书来安装任何东西。喜欢什么。 阅读手册的this section,安装MacPorts后可以做sudo port install gcc47,你必须找到使用g++ 4.7的命令(我不记得了)。另外,我认为 Mac 安装了现代 Clang。 @SethCarnegie 是的,但是用clang 编译我得到fatal error: 'chrono' file not found 是的,你必须告诉它你的标准库在哪里,什么东西,我不知道该怎么做。您可以通过选项或其他方式检查 XCode 如何调用它。但我避免了所有这些,只使用我向您展示的命令安装 GCC。 【参考方案1】:

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

【讨论】:

哈哈。谢谢!!太混乱了,也谢谢你的解释!所以 llvm 后端不管用 gcc/clang 来做实际的编译吗?所以-stdlib=libc++ 告诉编译器在哪里可以找到我想要的库,'-std=gnu++11` 告诉编译器要遵循什么版本?为什么 gnu 甚至会参与其中? This post 回答了-std=gnu++11-std=c++11 之间的差异。简短的回答是,gcc 描述了一些通常需要的 c++ 扩展。 Clang 可以选择实现它们。 您的说法也是正确的,即 LLVM 后端无论如何都会进行实际编译,然后 gcc 或 clang 正在进行解析。 最后要注意的是,GCC 和 libstdc++ 确实支持 C++11。但是,由于担心许可 (GPLv3),Apple 仅包含该软件的旧版本(不支持它)。【参考方案2】:

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

【讨论】:

感谢您的回复。什么是c++??伙计,我很困惑。所有这些编译器都一样吗?不同的?有点不同? @ZacharyO'Keefe c++clang++ 的别名。 @SethCarnegie 是 clang++clang 不同吗?人。哈哈。 llvm-gcc 是什么?是llvm吗?海湾合作委员会? clang++clang 就像 g++gcc;一个用于 C++,另一个用于 C。llvm-gcc 是针对代码生成的 LLVM 的 GCC 版本。【参考方案3】:

@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 的兼容性如何。

【讨论】:

以上是关于获得 c++11 - 兼容的编译器的主要内容,如果未能解决你的问题,请参考以下文章

Qt Creator 无法用 C 不兼容的代码编译外部“C”块

使用 mono 交叉编译 c 时跳过不兼容的库 (lmono)

使用一种编译器创建的静态 c 库是不是与另一种兼容?

C++语法小记---标准库

具有不同编译器的 C++ 和可变参数

Dev-C++ 5.11中文版软件下载和安装教程|兼容WIN10