15

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

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

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

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

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

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

4

4 回答 4

8

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

LLVM-GCC 只是一个编译器前端,它的作用是使用 GCC 前端将源代码转换为 LLVM IR[ 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 可能已经支持所有 c++11 特性
  • 如果您希望自制软件支持 LLVM,它已经支持,至少在后端。
  • 如果您想要使用 clang 作为编译器前端的自制软件,这取决于自制软件社区的时间表。例如,你可以附加--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提出拉取请求。

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

于 2013-04-26T17:00:02.783 回答
7

我有一个 OS X Mountain Lion 环境并使用 C++11。在这个答案中,我将打破您不编译自己的东西的要求。

我使用 Homebrew,我必须说,我建议你放弃依赖它来为你提供 clang 和 libc++ 以及所有用它们构建的公式。

我所做的,我喜欢的,是

  • 从存储库中克隆 llvm、clang 和 libc++。
  • 安装到/opt/local并放在/opt/local/bin上面/etc/paths
  • 用我的新 clang 构建我的开发工具。
  • 让 Homebrew 安装像 git 这样的工具和我不会开发的东西,只是使用。

我已按照 clang 构建说明将其安装到/opt/local.

对于 libc++,一个细节:运行buildit脚本后,我将包含目录符号链接到/opt/local/lib/c++/v1(clang on/opt/local将其视为默认目录),并将库符号链接到/opt/local/lib/(但看起来二进制文件不会自动链接到 libc++ 上/opt/local/lib。你必须为此使用install_name_tool)。

于 2013-01-03T05:13:04.867 回答
1

利用

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

您还可以从 homebrew-dups 安装最新的 gcc

brew install [flags] https://raw.github.com/Homebrew/homebrew-dupes/master/gcc.rb
于 2013-01-03T04:41:51.877 回答
0

对于 LLVM brew install --HEAD llvm,. 要使用 clang 或 brew 安装的 gcc,请添加--with-clang--with-gcc=gcc-x.xxx 是您想要的版本。

于 2013-04-24T16:55:55.970 回答