c++ - 在 C++ 11 中使用 Homebrew 软件、gcc 和 llvm

标签 c++ gcc c++11 llvm homebrew

这是我的问题:我想使用 gcc 或 clang 提供的 C++11 功能。但是,我有这些要求:

  1. 我使用的是 Mac
  2. 我依赖于 Homebrew 软件提供的一堆库(真的不想自己编译它们)。特别是 OSG,它本身依赖于大量其他库。还有提升,虽然我总是可以自己编译。

Homebrew 似乎只想使用 gcc(如果我错了,请纠正我)。我找不到任何切换到 LLVM 的选项。虽然我知道这可能是由于并非所有库都与 LLVM 兼容,但这对于那些兼容的库来说仍然是一个不错的功能。

gcc mac 上预装的 gcc 版本是 4.2。 gcc 4.2 没有所需的 c++11 功能。我已经通过 Homebrew 软件安装了 4.7,但是搜索如何设置 Homebrew 软件来使用它都说不要这样做(mac 上的 gcc 4.2 不是 Vanilla 版本,所以我得到的 4.7 版本将无法编译一些东西)。

我的问题是:是否有人为解决此问题而实现了任何建议或修复?我应该放弃 Homebrew 吗?有谁知道 Homebrew 是否有计划在未来切换到 LLVM?有没有人有任何升级计划来解决这些不兼容问题?

从长远来看,我看不出 Homebrew 软件如何继续依赖 gcc 4.2,但还没有找到任何关于这个问题的真正讨论。

最佳答案

Mac 上的默认 GCC 不是真正的 GNU GCC。它实际上是 LLVM-GCC,它是 GCC 的一个分支。几年前,LLVM-GCC 被终止,取而代之的是 DragonEgg ,这是一个使用 LLVM 作为 GCC 后端的 GCC 插件。

LLVM-GCC 只是一个编译器前端,它的作用是使用 GCC 前端将源代码翻译成 LLVM IR[ Intro to LLVM 11.3]。一旦 IR 生成,LLVM 后端将使用它来生成二进制代码。此步骤与 GCC 无关。

上述目标从 10.7 开始完全实现,其组件全部由 LLVM 提供的前端 clang 编译。

但 Apple 仍然保留 LLVM-GCC 和 GCC 运行时库。我猜它的目的可能是提供一个机会来编译一些代码 GCC ONLY。

现在让我们回答你的问题:

  • 如果您想使用 C++11 功能,请改用 clang++ -stc=c++11 -stdlib=libc++。和clang might have already supported all c++11 features .
  • 如果您希望 Homebrew 软件支持 LLVM,它已经支持,至少在后端。
  • 如果您想要使用 clang 作为编译器前端的 Homebrew 软件,这取决于 Homebrew 软件社区的日程安排。例如,可以附加--with-c++11 参数来使用clang 编译boost。但是brew install autoconf 时不能使用该参数。实际上,clang 可能无法正确编译某些组件。
  • 如果你知道它可以被 clang 编译,但 homebrew 还不支持,你必须在 $HOMEBREW_ROOT/Library/Formula 目录下破解相应的 ruby​​ 脚本。幸运的是,在大多数情况下,将 ./configure blablabla 替换为 ./configure blablabla CXX=clang++ -stc=c++11 -stdlib=libc++ 效果很好。顺便说一句,如果您的 hack 成功,请向 homebrew 提出拉取请求.

所以,试试看,玩得开心。

关于c++ - 在 C++ 11 中使用 Homebrew 软件、gcc 和 llvm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14128298/

相关文章:

c++ - 这个编译器消息(矢量化,GCC)是什么意思?

c - 信号量意外设置

c++ - 在 C++ 中如何使用模板调用提供类型的特定成员

c++ - Boost 过程中缺少异常

c++ - 为什么我的发布版本仍在寻找调试 DLL (MSVCR110D.dll)?

c++ - 尝试递增 initializer_list.begin() 返回的迭代器时出现编译错误

c - gcc -O 段错误

c++ - 为什么在这种情况下不会调用移动构造函数?

c++ - 如何在容器中指定模板化别名的泛型类型

c++ - 在 C/C++ 中将 1 位 bmp 文件转换为数组