Xcode10适配之libstdc++.6.0.9

Xcode10适配之libstdc++.6.0.9

2019-03-01 | |

Starting March 2019, all iOS apps submitted to the App Store must be built with the iOS 12.1 SDK or later, included in Xcode 10.1 or later.
译:从2019年3月开始,所有提交到AppStore的iOS应用程序都必须使用iOS12.1的SDK或更高版本,包括在Xcode 10.1或更高版本中。

前言

前段时间迟迟不敢更新最新的 Xcode,就是担心之前维护的老项目会出现比较大的异常。老项目
是 14 年开的,一直维护到现在,中途几经人手,而且项目中用到很多第三方的 SDK,包括一些
对接硬件和视频的东西,添加的依赖关系也比较杂乱,所以我当时的想法就是就只要项目能够正常运行、正常打包、正常上架,能不更新 Xcode 就不更新 Xcode。只是理想很丰满,现实太骨感,在最近一次上架的时候,苹果回了一封邮件,意思是要我用最新的 Xcode 打包上架。所以就只能更新了。当我更新完之后,重新打开项目时,果然,该来的迟早会来的。编译后,红了一大片,只能硬着头皮一个个看,然后在网上找资料,最后总算是将问题都解决了。现将其中一个比较典型的问题分享出来,以便以后查看!

问题描述

当我使用模拟器或者真机进行编译时,提示 libstdc++.6.0.9 这个库找不到。下面是具体报错的截图:

问题分析

由于项目中引用的第三方库中依赖了 libstdc++ 这个库,而苹果在 Xcode10 和 iOS12 中移除了 libstdc++ 这个库,苹果的解释是 libstdc++ 这个库已经标记为废弃5年了,建议大家使用经过了 llvm 优化过的 libc++ 库。

解决方案

临时解决方案

手动将 libstdc++ 这个库添加到最新的 Xcode 目录中。
可以在更新之前的 Xcode(Xcode9 或之前的版本) 的目录中将 libstdc++ 相关的库拷贝出来,然后添加到最新的 Xcode10 的目录中。下面是具体路径:

1
2
3
4
5
6
7
8
模拟器的目录
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib

真机的目录
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib

动态链接库目录
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib

注:模拟器和真机对应的目录是不同的,需要分别进行拷贝。

为了以后能够方便的进行拷贝,这里将两份文件的压缩包提供出来。

  1. libstdc++.6.0.9.tbd.zip 解压,放到上面对应的真机的目录下
  2. libstdc++.6.0.9.tbd_simulator.zip 解压,放到上面对应的模拟器的目录下
  3. libstdc++.6.0.9.dylib.zip 解压,放到上面对应的动态链接库的目录下

正确解决方案

  • 更改项目的依赖库。
    如果你自己的项目需要依赖 libstdc++ 这个库,那么将依赖的库修改为 libc++。然后重新编译,看是否存在问题。

  • 如果是使用的第三方库中依赖了 libstdc++ 这个库,那么就需要联系第三方的技术人员,要求他们更新自己的SDK。