Xcode10 关于 libstdc++.6.0.9 的兼容问题
2018-10-17 本文已影响179人
ibingewin
Xcode10 关于 libstdc++.6.0.9 的兼容问题
升级Xcode10 后, 项目编译时会报错如下
![]()
原因是: 苹果早在Xcode 8中 就废弃了libstdc++, 给了开发者两年时间过渡, 如今在Xcode 10中已不再支持. 在Build Phases > Link Binary With Libraries中已经搜不到libstdc++的库了
![]()
Xcode 10 更多特性, 可以参阅这里
解决方案
首先要找到具体是哪个库使用了
libstdc++.我的项目是用cocoapods管理第三方,可以在Pods-xxx.xcconfig中, 看到cocoapods的编译选项有libstdc++6.0.9
![]()
手动去掉
-l"stdc++.6.0.9"后进行编译, 结果如下:
![]()
可以看到, 问题出在AMapNaviKit这个第三方库, 是高德导航库
解决方法有两个:
-
- 更新第三方:
- 我的项目中用到的
AmapKitNavi是很早的2.3.0的版本,高德导航库的最新版本已经迁移到了libc++, 故将其更新到最新版本, 即可解决.
由于高德导航库的前后版本相隔较远, 更新后需要修改部分代码, 为了防止因改动代码而影响原有的逻辑, 我选择了第二种方法.
但开发者最好还是用第一种方法,直接更新第三方, 临时方案毕竟只能过渡用, 做苹果开发还是要跟着
苹果爸爸的屁股后走的.
-
-
拷贝
Xcode 9中的libstdc++.6.0.9库文件到Xcode 10中:
- 要同时支持真机和模拟器, 需要将
Xcode 9中各平台的SDK中的libstdc++.6.0.9库, 分别拷贝到Xcode 10中.注意:libstdc++.6.0.9各不相同, 可以通过大小看出来, 不要弄错了, 具体路径如下所示
-
拷贝
libstdc++.6.0.9文件资源可以在百度网盘获取, 提取码:njj8
| 平台 | 文件夹 | 文件名 | 文件大小 | 路径 |
|---|---|---|---|---|
| 模拟器运行 | CoreSimulator | libstdc++.6.0.9.dylib | 766,624B | /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/ |
| 模拟器编译 | iPhoneSimulator | libstdc++.6.0.9.tbd | 206,800B | /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/ |
| iOS真机 | iPhoneOS | libstdc++.6.0.9.tbd | 209,673B | /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/ |
| macAPP | MacOSX | libstdc++.6.0.9.tbd | 206,751B | /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib/ |
注意: 如果不做mac开发, MacOSX可以不用添加. 但要支持模拟器需要CoreSimulator 和 iPhoneSimulator两个路径都添加上, 如果只添加了iPhoneSimulator, 可以编译通过, 但运行时会崩溃,如下: