12

我在我的项目中大量使用了 c++0x/c++11 特性,尤其是代码块和共享指针。当我将操作系统升级到 10.8 Mountain Lion(编辑:从 10.7 开始)时,我被迫升级 Xcode。在升级 Xcode 时,我无法编译我的 c++ 项目以在 10.6 系统上部署,因为我收到以下错误。

clang: error: invalid deployment target for -stdlib=libc++ (requires Mac OS X 10.7 or later)

看来,Apple 试图通过不允许开发人员支持 Snow Leopard 来强迫人们进行升级。这让我很生气。啊啊啊!!!

我能做些什么?

编辑:经过多次评论后,应该明确的是 10.6 不附带系统 libc++ 库。因此,仅仅能够为 10.6 部署构建一个 libc++ 项目是不够的。您还需要在 10.6 发行版中包含 libc++ 二进制文件或静态链接到它们。因此,让我们继续假设我已经在这样做。

更新 1:此问题最初旨在与 Xcode 4.5.2 (提出问题时的最新版本)一起使用。我已经升级到 Xcode 4.6.3 并更新了问题和答案以反映这一点。

更新 2:我已经升级到 Xcode 5.0.2。下面所选答案中列出的技术仍然可以按预期工作。

更新 3:我已经升级到 Xcode 5.1。以下答案中列出的技术尚不适用于此版本!

更新 4:我已经升级到 Xcode 6.0.1。下面所选答案中列出的技术似乎再次起作用。

更新 5:我已经升级到 Xcode 7.1.1。下面所选答案中列出的技术似乎再次起作用,但有一个重要警告。您必须禁用用于AppThinning的 Bitcoding,因为开源 LLVM 版本不支持它(也不应该)。因此,您需要在开源和 Apple LLVM clang 之间切换,以便为 10.6 和 tvOS/watchOS 进行编译(因为这些操作系统需要位编码)。

4

2 回答 2

12

Apple 已决定仅在 10.7 或更高版本上正式支持 libc++。因此,Xcode 附带的 clang/llvm 版本会在使用 libc++ 时检查部署目标是否设置为 10.6,并阻止您进行编译。但是,这个标志包含在 clang/llvm 的开源版本中。

看看这个线程: http: //permalink.gmane.org/gmane.comp.compilers.clang.devel/17557

因此,要编译使用 c++11 进行 10.6 部署的项目,您需要为 Xcode 提供开源版本。这是一种方法:

  1. 从此处下载 clang 的开源版本(对 Xcode 4.5.x 使用 LLVM 3.1;对 Xcode 4.6.x 使用 LLVM 3.2;对 Xcode 5.0.x 使用 LLVM 3.3;对 XCode 6.0.1 使用 LLVM 3.5.0;使用 LLVM XCode 7.1.1 的 3.7.0): http: //llvm.org/releases/download.html
  2. 备份 Xcode 的默认 clang 编译器并将其放在安全的地方(以防万一你搞砸了!)它位于:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
  3. 将默认的 clang 编译器替换为您从 [1] 下载的编译器
  4. sudo chown root:wheel clang从 [2] 中列出的 bin 目录中chown 用于 root:wheel 的 clang 二进制文件。
  5. 启动 Xcode 并编译!

更新 #1:此技术目前不适用于依赖 LLVM 3.4 的 Xcode 5.1 或更高版本。当我有更多时间时,我会尝试找到一个解决方案来在这里发布。但是,如果有人在我之前提出解决方案,他们应该将其发布为答案。

更新#2:不幸的是,我不记得我是否曾经找到过适用于 Xcode 5.1 的解决方案,但是我可以确认该技术仍然适用于 Xcode 6.0.1。我还没有测试过更新的版本,但它仍然可以工作。

更新#3:这种技术似乎仍然适用于使用 LLVM 3.7.0 的 XCode 7.1.1。但是,开源 LLVM clang 不支持 Bitcoding。因此,您需要在开源编译器和 Apple 编译器之间切换,以便为 10.6 和 tvOS/watchOS(需要位编码)进行开发。

PS:LLVM 3.4 和 3.5.0 的 Mac OS X 二进制文件在 www.llvm.org/releases/download.html 上列为“Clang for Darwin 10.9”,而不是在以前的版本中列为“Clang Binaries for Mac OS X”。

于 2013-01-24T05:21:01.160 回答
8

虽然 Xcode 4.5.x 是 OS X 10.8 上的当前默认版本,但只要您有权访问其安装程序,您就可以在 10.8上使用其他旧版本的 Xcode,例如用于 OS X 10.6 的 Xcode 3.2.6 。您需要确保将每个安装到唯一的目录。此外,您不能或不应该做的一件事是将Command Line Tools旧 Xcode 的组件或安装程序包安装到您的 10.8 系统上,即不要安装到/usr/System/Library. 您可以使用xcodebuildxcode-selectxcrun命令行 工具来访问非默认 Xcode 组件。有关更多信息,请参阅他们的man页面。developer.apple.com的注册用户可以使用旧版本的 Xcode

更新:根据您随后的评论,我相信我确实错过了问题的重点,并且您已经回答了自己的问题。我认为您所说的是您从 10.7 升级到 10.8,而不是像我假设的那样从 10.6 升级到 10.8。您在最初的问题中也没有明确说明您正在libc++使用您自己的应用程序从 10.7 分发您自己的 Apple 和朋友版本。Apple 不会在 Xcode 中轻松地做类似的事情,因为长期以来 Apple 的政策是不鼓励与库的静态链接或分发重复的库(在某些情况下可能违反许可条款)。这项政策有充分的理由。

底线libc++是仅随 OS X 10.7 或更高版本的系统一起提供。10.6 中从未有过 Apple 支持libc++,因此说它已被删除是一种误导。如果您想提供可部署在 10.6 及更高版本系统上依赖于的应用程序,libc++最安全的方法是构建您自己的 clang/llvm 并libc++针对 OS X 10.6 并使用它来构建您的项目。有多种方法可以做到这一点,可能最简单的方法是使用 MacPorts 版本并在 MacPorts 中为 10.6 设置部署目标。或者自己从头开始构建。但是在 Xcode 4.5 中修改 clang 编译器是个坏主意。将 Apple 库复制到自己的应用程序通常是个坏主意。

如果您有适合您的解决方案,那就太好了。但我不会向其他人推荐它。

于 2013-01-24T06:10:52.943 回答