如何使用Xcode 4.6.2至7.1.1获得对Mac OS X 10.6部署的c ++ 0x/c ++ 11支持

Big*_*ack 11 c++ osx-snow-leopard c++11 libc++ xcode4.6

我在项目中大量使用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)

苹果似乎试图通过不允许开发者支持Snow Leopard来强迫人们进行升级.这让我很生气.Arrrggg!

我能做什么?

编辑:经过几次来回评论后,应该明确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.下面选定答案中列出的技术似乎再次起作用,但有一个重要的警告.您必须禁用Bitcoding用于AppThinning因为开源LLVM版本不支持它(也不应该).因此,您需要在开源和Apple LLVM clang之间切换,以便为10.6和tvOS/watchOS进行编译(因为这些操作系统需要Bitcoding).

Big*_*ack 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 for 10.6部署的项目,您需要为Xcode提供开源版本.这是一种方法:

  1. 从这里下载clang的开源版本(使用LLVM 3.1 for Xcode 4.5.x;使用LLVM 3.2 for Xcode 4.6.x;使用LLVM 3.3 for Xcode 5.0.x;使用LLVM 3.5.0 for XCode 6.0.1;使用LLVM 3.7.0 for XCode 7.1.1):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目录中选择root的clang二进制文件:wheel with .
  5. 启动Xcode并编译!

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

更新#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(需要Bitcoding)进行开发.

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

  • #2,#3是非常错误的建议:这是/ usr/local的用途,创建:/ usr/local/src并在那里构建llvm/clang/libcxx; 重定向一切以使用这些 (3认同)

Ned*_*ily 8

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

更新:根据您随后的评论,我相信我确实错过了问题的重点,并且您已回答了自己的问题.我想你所说的是你从10.7升级到10.8,而不是像我想象的那样从10.6升级到10.8.您还没有在原始问题中明确表示您libc++使用自己的应用程序从10.7 分发自己的Apple版本和朋友.苹果公司在Xcode中做这样的事情并不容易,因为苹果的政策长期以来一直禁止与libs的静态链接或分发重复的libs(在某些情况下可能违反许可条款).该政策有充分的理由.

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

如果你有一个适合你的解决方案,那很好.但我不会向其他人推荐它.