我在我的项目中大量使用c++0x/c++11特性,特别是代码块和共享指针。当我将操作系统升级到10.8山狮(编辑:从10.7)时,我被迫升级了Xcode。在升级Xcode时,我失去了编译c++项目以便在10.6系统上部署的能力,因为我得到了以下错误。
clang: error: invalid deployment target for -stdlib=libc++ (requires Mac OS X 10.7 or later)
苹果似乎试图通过不允许开发者支持雪豹来迫使人们升级。这让我很生气。阿瑞格!
我能做什么?
编辑:经过多次评论后,应该清楚说明10.6没有随系统libc++库一起运行。因此,仅仅能够构建一个用于10.6部署的libc++项目是不够的。您还需要在10.6发行版中包含libc++二进制文件,或者静态地链接到它们。因此,让我们继续假设我已经在这样做了。
更新1:这个问题最初是用于XCode4.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,因为开放源码LLVM版本不支持它(也不应该支持它)。因此,您需要在开放源代码和之间切换,以便同时编译10.6和tvOS/OSes(因为这些需要比特编码)。
发布于 2013-01-24 05:21:01
苹果决定只在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提供开源版本。这里有一种方法:
sudo chown root:wheel clang的clang二进制文件。更新#1:这种技术目前不适用于XCode5.1或更高版本,后者依赖于LLVM3.4。当我有更多的时间,我将试图找到一个解决办法,在这里张贴。但是,如果有人在我之前想出了解决办法,他们应该把它作为一个答案。
更新2:不幸的是,我不记得我是否找到了Xcode 5.1的解决方案,但是我可以确认Xcode 6.0.1的技术仍然有效。我还没有在比这更新的版本上进行测试,但它仍然可以工作。
更新#3:使用LLVM3.7.0,此技术似乎仍然适用于XCode 7.1.1。但是,开放源码LLVM clang不支持比特编码。因此,您需要在开放源代码编译器和Apple编译器之间切换,以便为10.6和tvOS/watchOS (它们需要比特编码)进行开发。
P.S.:用于LLVM 3.4和3.5.0的Mac OS X二进制文件在www.llvm.org/releases/Dowload.html上被列为"Clang for Darwin 10.9“,而在以前的版本中则被列为"Clang二进制for Mac”。
发布于 2013-01-24 06:10:52
虽然Xcode 4.5.x是OSX10.8上的当前默认版本,但只要您能够访问它们的安装程序,就可以使用其他旧版本的Xcode,例如Xcode 3.2.6操作系统X10.6,见10.8。您需要确保将每个目录安装到唯一的目录中。另外,您不能也不应该做的一件事是将Command Line Tools组件或旧Xcode安装程序包安装到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版的朋友。苹果并不容易在Xcode中做这样的事情,因为长期以来,苹果的政策是阻止静态链接与libs或分发重复的libs (在某些情况下,这可能违反许可条款)。制定这一政策是有充分理由的。
底线是,libc++只随OSX10.7或更高版本的系统一起提供。在10.6年代,苹果从来没有支持过libc++,所以说它被删除是有误导的。如果您想提供一个部署在10.6及更高版本系统上并依赖于libc++的应用程序,最安全的方法是为OSX10.6构建自己的clang/llvm和libc++,并使用它们来构建您的项目。有多种方法可以做到这一点,可能最简单的方法是使用MacPorts版本,并在MacPorts中将部署目标设置为10.6。或者自己从头开始建造。但是在Xcode 4.5中修改clang编译器是个坏主意。将苹果库复制到应用程序通常是个坏主意。
如果你有一个对你有用的解决方案,太好了。但我不会推荐给其他人。
https://stackoverflow.com/questions/14494513
复制相似问题