如何在Mac上编译C++11代码?

5

我对C++11还不熟悉。我尝试过:

clang++ -std=c++11 -stdlib=libc++ *.cc

它可以工作,但我的问题是:

  1. 有没有办法将这些标志设置为clang++的默认值?
  2. 如何更新g++ 4.2到支持C++11的版本?
  3. 您认为在Mac上编译C++11代码的最佳方式是什么?

谢谢。


5
有没有办法将这些标志设置为clang++的默认值?你不能只是将这个标志添加到IDE/ CMake /任何其他构建系统配置文件中的项目选项吗? - awesoon
那么你的空指针问题是什么? - Kerrek SB
4个回答

6

Brett已经描述了如何使用MacPorts安装GCC。以下是使用Homebrew的方法,它自称(理所当然!)是MacPorts的现代替代品:

brew tap homebrew/versions
brew install --enable-cxx gcc48

据我所知,安装最新的Clang最简单的方法是通过下载dsign答案中链接的已编译版本 - 正如Brett提到的那样,由于Apple内部使用clang,不建议对该安装进行任何调整 - 只需将您的安装放在其他地方即可。
关于“最佳”编译器,除了Brett已经提到的内容外,还有两个要考虑的问题:
1. GCC比Clang更老、更成熟。 Clang偶尔会出现内部编译器错误。尽管如此,它正在迅速成熟,因为它受到几家公司的推动。
2. Clang对C++11是功能完整的,而GCC 4.8则不是。一个非常明显的例子是,GCC 4.8仍然没有一个可工作的实现,这是一件遗憾的事情。

我只是懒得尝试Homebrew。最近让我感到烦恼的一件事是,尽管设置正确、安装了最新的Xcode等,但在许多情况下无法从源代码安装(构建)端口。 - Brett Hale
@manasij7479 那则新闻报道是错误的,而我的回答已经包含了原因。编译器可能是功能完整的,但他们的标准库实现并不完整。 - Konrad Rudolph
好的,那能否给我一些不能工作的<regex>代码?我记得尝试过简单的教程,一切都运行良好。 - manasij7479
1
@manasij7479 你一定记错了。没有任何东西能够运行,即使是最小的例子:http://coliru.stacked-crooked.com/view?id=a6bc1d6515491e6c95c50375657cc8b8-50d9cfc8a1d350e7409e81e87c2653ba,而GCC官网也非常明确地指出:http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011。 - Konrad Rudolph
你说得对。我可能使用了clang。boost.regex是GCC的替代品吗? - manasij7479
显示剩余2条评论

5

在IDE之外(例如在shell中),我通常将变量CXX设置为:"clang -std=c++11 -stdlib=libc++",存储在.profile/.tcshrc/等文件中,因为大多数configure脚本也会使用这个变量。在命令行上,我可能会使用:$CXX -c foo.cc

MacPorts的gcc-4.8.1效果很好:"[sudo] port install gcc48 [-universal]"

"[sudo] port select --set gcc gcc48"将使这成为默认的gccg++等。

不要尝试更新或修改系统工具,比如随Xcode一起提供的旧版gcc-4.2/llvm混合工具。

我不知道你在第三部分问题中所说的“最佳”方式是什么意思,但由于苹果的支持(他们雇用了LLVM的主要作者)和其他项目(如FreeBSD),clang将继续改进。它已经比gcc快得多,有更好的错误消息/诊断(特别是对于C++和模板),并且具有模块化的架构。对于OS X,它是明显的选择。


1

答案:

  1. 我不这么认为
  2. 你可以在4.2版本旁边安装另一个g++版本,删除系统自带的版本是不好的。要安装新版本,请查看this
  3. 同样适用于clang。你可以从here下载它。

总的来说,我强烈推荐您使用更好的g++编译器,4.2版本相当老,其代码质量不如其他版本。而且使用c++ 11完全值得。


@KonradRudolph 对的!然而,你的解决方案看起来并不像在某个地方拥有系统范围的C++编译器配置设置那样万无一失,再次强调,这对于需要在没有C++ 11的情况下编译的老式程序来说是一个非常糟糕的想法(为什么会发生这种情况?)。因此,我的工作建议是“不要懒惰,注意标志”。 - dsign
来自 Stack Overflow 上的 Lounge<C++> 聊天室的人想和你说句话。实际上,如果小心一点将标志设置为默认值并不是问题。如果您正在编译旧软件,只需重置相关环境变量即可。 - Konrad Rudolph

1

像大多数苹果开发者一样,在Xcode的构建设置中完成所有操作。Xcode在许多方面都简化了生活。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接