Xcode10 关于 libstdc++.6.0.9 的兼容问题

Xcode10 关于 libstdc++.6.0.9 的兼容问题

升级Xcode10 后, 项目编译时会报错如下

1262232-755ca856dc352fc4.png
image

原因是: 苹果早在 Xcode 8中 就废弃了libstdc++, 给了开发者两年时间过渡, 如今在Xcode 10中已不再支持. 在Build Phases > Link Binary With Libraries 中已经搜不到libstdc++的库了

1262232-f6d623d130b08523.png
image

Xcode 10 更多特性, 可以参阅这里

解决方案

首先要找到具体是哪个库使用了libstdc++.我的项目是用cocoapods管理第三方,可以在Pods-xxx.xcconfig中, 看到cocoapods 的编译选项有libstdc++6.0.9

1262232-245d9983810d40b2.png
image

手动去掉-l"stdc++.6.0.9"后进行编译, 结果如下:

1262232-9284c843f3fa0e98.png
image

可以看到, 问题出在AMapNaviKit这个第三方库, 是高德导航库

解决方法有两个:

    1. 更新第三方:
    • 我的项目中用到的AmapKitNavi 是很早的2.3.0的版本,高德导航库的最新版本已经迁移到了libc++, 故将其更新到最新版本, 即可解决.

由于高德导航库的前后版本相隔较远, 更新后需要修改部分代码, 为了防止因改动代码而影响原有的逻辑, 我选择了第二种方法.

但开发者最好还是用第一种方法,直接更新第三方, 临时方案毕竟只能过渡用, 做苹果开发还是要跟着苹果爸爸的屁股后走的.

    1. 拷贝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可以不用添加. 但要支持模拟器需要CoreSimulatoriPhoneSimulator两个路径都添加上, 如果只添加了iPhoneSimulator, 可以编译通过, 但运行时会崩溃,如下:

1262232-aa386b9b138b5a9a.png
image

猜你喜欢

转载自blog.csdn.net/weixin_34248118/article/details/86984400