使用自制软件,gcc和llvm与C++ 11

Abe*_*der 15 c++ homebrew gcc llvm c++11

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

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

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

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

我的问题是:有没有人有任何建议或修复他们已经实现解决这个问题?我应该放弃Homebrew吗?有谁知道Homebrew是否有计划在未来转向LLVM?有没有人有如何处理这些不兼容性的升级计划?

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

Mat*_*ang 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,其组件全部由clang编译,这是LLVM提供的前端.

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

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

  • 如果要使用C++ 11功能,请clang++ -stc=c++11 -stdlib=libc++改用.而铛可能已经支持的所有C++ 11种功能.
  • 如果你想让自制软件支持LLVM,它已经支持,至少在后端支持.
  • 如果你想使用clang作为编译器前端的自制软件,它取决于自制社区日程安排.例如,你可以附加--with-c++11参数来使用clang来编译boost.But你不能使用这个参数brew install autoconf.实际上,clang可能无法正确编译某些组件.
  • 如果你知道它可以由clang编译但是homebrew尚未支持,你必须在$HOMEBREW_ROOT/Library/Formula目录下破解相应的ruby脚本.幸运的是,在大多数情况下,替换./configure blablabla./configure blablabla CXX=clang++ -stc=c++11 -stdlib=libc++效果很好.顺便说一句,如果您的黑客成功,请向自制程序提出拉取请求.

所以,试试吧,玩得开心.


pep*_*ico 7

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

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

我所做的和我喜欢的是

  • 从存储库克隆llvm,clang和libc ++.
  • 安装到/opt/local,并把/opt/local/bin在顶部上/etc/paths.
  • 用我的新铿锵语构建我的开发资料.
  • 让Homebrew安装像git这样的工具和我不会开发的东西,只需使用.

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

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

  • 我实际上对clang/libc ++的当前版本没问题.我的主要问题是拥有依赖stdlibc ++的库.当您尝试将使用stdlibc ++的库与您自己的使用libc ++的代码混合时,通常会发生错误. (2认同)

loc*_*jay 1

使用

clang++ -std=c++11 -stdlib=libc++ 
Run Code Online (Sandbox Code Playgroud)

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

brew install [flags] https://raw.github.com/Homebrew/homebrew-dupes/master/gcc.rb
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,如果这些库是使用 libstdc++ 和自制软件编译的,而我使用 libc++ 的话,就会发生不好的事情。理论上,这两个库应该大部分兼容,但 std::strings 的实现方式不同。我确实安装了较新版本的 gcc,但据我了解,homebrew 仍将使用 4.2(由于 Apple 对其进行了更改)。 (4认同)