草庐IT

c++ - 如何使用 Xcode 4.6.2 到 7.1.1 恢复对 Mac OS X 10.6 部署的 c++0x/c++11 支持

coder 2023-06-04 原文

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

clang: error: invalid deployment target for -stdlib=libc++(需要 Mac OS X 10.7 或更高版本)

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

我能做什么?

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

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

更新 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 进行编译(因为这些操作系统需要位编码)。

最佳答案

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 ; 对 XCode 7.1.1 使用 LLVM 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. 使用 [2] 中列出的 bin 目录中的 sudo chown root:wheel clang 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(需要位编码)进行开发。

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

关于c++ - 如何使用 Xcode 4.6.2 到 7.1.1 恢复对 Mac OS X 10.6 部署的 c++0x/c++11 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14494513/

有关c++ - 如何使用 Xcode 4.6.2 到 7.1.1 恢复对 Mac OS X 10.6 部署的 c++0x/c++11 支持的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  3. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  4. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  5. ruby - 安装libv8(3.11.8.13)出错,Bundler无法继续 - 2

    运行bundleinstall后出现此错误:Gem::Package::FormatError:nometadatafoundin/Users/jeanosorio/.rvm/gems/ruby-1.9.3-p286/cache/libv8-3.11.8.13-x86_64-darwin-12.gemAnerroroccurredwhileinstallinglibv8(3.11.8.13),andBundlercannotcontinue.Makesurethat`geminstalllibv8-v'3.11.8.13'`succeedsbeforebundling.我试试gemin

  6. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  7. 由于 libgmp.10.dylib 的问题,Ruby 2.2.0 无法运行 - 2

    我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro

  8. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  9. ruby - ri 有空文件 – Ubuntu 11.10, Ruby 1.9 - 2

    我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da

  10. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

随机推荐