C++ 我如何取回c++;0x/c++;11使用Xcode 4.6.2至7.1.1支持Mac OS X 10.6部署

C++ 我如何取回c++;0x/c++;11使用Xcode 4.6.2至7.1.1支持Mac OS X 10.6部署,c++,c++11,osx-snow-leopard,xcode4.6,libc++,C++,C++11,Osx Snow Leopard,Xcode4.6,Libc++,我在项目中大量使用c++0x/c++11特性,特别是代码块和共享指针。当我将操作系统升级到10.8 Mountain Lion(编辑:从10.7开始)时,我被迫升级Xcode。在升级XCODEL时,我失去了编译我的C++项目在10.6个系统上部署的能力,因为我得到以下错误。 clang:error:-stdlib=libc++的部署目标无效(需要Mac OS X 10.7或更高版本) 看来苹果正试图通过不允许开发者支持雪豹来迫使人们升级。这让我很生气。啊 我能做什么 编辑:经过多次反复评论后,应

我在项目中大量使用c++0x/c++11特性,特别是代码块和共享指针。当我将操作系统升级到10.8 Mountain Lion(编辑:从10.7开始)时,我被迫升级Xcode。在升级XCODEL时,我失去了编译我的C++项目在10.6个系统上部署的能力,因为我得到以下错误。
clang:error:-stdlib=libc++的部署目标无效(需要Mac OS X 10.7或更高版本)

看来苹果正试图通过不允许开发者支持雪豹来迫使人们升级。这让我很生气。啊

我能做什么

编辑:经过多次反复评论后,应该明确指出10.6不随system 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。下面所选答案中列出的技术似乎再次发挥作用,但有一个重要的警告。由于开源LLVM版本不支持(也不应该支持),因此必须禁用用于AppThinging的。因此,您需要在开源和Apple LLVM clang之间切换,以便为10.6和tvOS/watchOS进行编译(因为这些操作系统都需要位编码)。

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

看看这条线:

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

  • 从这里下载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;对于Xcode 7.1.1使用LLVM 3.7.0):
  • 备份Xcode的默认clang编译器,并将其放在安全的地方(以防搞砸!) 地址为: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
  • 将默认的clang编译器替换为从[1]下载的编译器
  • 使用[2]中列出的bin目录中的sudo chown root:wheel clang,chown root:wheel的铿锵二进制文件
  • 启动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不支持位编码。因此,您需要在开源编译器和Apple编译器之间切换,以便为10.6和tvOS/watchOS(需要位编码)开发


    注: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”。

    虽然Xcode 4.5.X是OS X 10.8上的当前默认版本,但您可以拥有其他旧版本的Xcode,例如,只要您有权访问他们的安装程序。您需要确保将每个安装到一个唯一的目录中。另外,您不能或不应该做的一件事是将旧Xcode的
    命令行工具
    组件或安装程序包安装到10.8系统上,即不要安装到
    /usr
    /system/Library
    。您可以使用
    xcodebuild
    xcode-select
    xcrun
    命令行工具访问非默认的xcode组件。有关更多信息,请参见他们的
    man
    页面。旧版本的Xcode可用于

    更新:根据你随后的评论,我相信我没有抓住问题的重点,而且你已经回答了你自己的问题。我想你是说你从10.7升级到了10.8,而不是像我想象的那样从10.6升级到10.8。在最初的问题中,您也没有明确表示您正在使用自己的应用程序分发自己版本的苹果
    libc++
    和10.7版的好友。苹果公司在Xcode中做这样的事情并不容易,因为长期以来,苹果公司的政策是不鼓励静态链接libs或分发重复libs(在某些情况下可能违反许可条款)。这一政策有很好的理由

    归根结底,
    libc++
    仅仅是sh