由libstdc++.6.0.9引起的项目兼容问题


Xcode 10bata版发布之后,运行现有项目,报错提示缺失libstdc++.6.0.9。

类似Libary not found for -lstdc++.6.0.9

究其原因,Apple从Xcode 8开始就宣布已经废弃了libstdc++.6.0.9,官方建议是用libc++.tbd代替;按照惯例,Apple会留给开发者两年的时间做替换准备。

但是部分小伙伴所用的很多第三方库文件是很久没更新过的历史版本,这些库引用的仍然是libstdc++.6.0.9,这时候用Xcode 10来编译这些项目,就会报上述错误。

临时解决方案

从旧版xcode包中拷贝缺失文件副本到新版Xcode 10中。
需要拷贝的文件路径如下:

  平台            文件名                             拷贝路径
模拟器运行  libstdc++.6.0.9.dylib  /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib
模拟器编译 libstdc++.6.0.9.tbd  /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/
iOS真机  libstdc++.6.0.9.tbd  /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/
MacOS libstdc++.6.0.9.tbd  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib/

优点:不需要更改项目代码。正在维护的项目这样做是最合适的。
缺点:项目相关的开发人员,每一个人都需要按照上述操作流程走一遍,费时费力;而且以后更新到更高版本Xcode,需要重新进行上述操作。

完全解决方案

在项目中更新项目中引用到库到最新版本。

正在开发中的项目或者用到新版系统API特性的,这时候最合适的解决方案就是更新第三方库。

优点:一劳永逸,项目能很方便的持续适配最新系统,使用最新API。
缺点:更新第三方库,如果第三库新旧版API差别较大,这时候不得不更改项目代码来适配新的API,修改完之后,还需要面临几轮测试周期,面临改出新bug的风险。

综上,手头上的项目如果是维护项目,不需要太大更改,但需要用最新Xcode编译运行甚至打包。临时方案最合适。如果没有用最新Xcode编译运行或打包的需求,完全可以用旧版Xcode,没必要用最新版xcode。除此之外,如果不是因为懒,建议用一劳永逸的方法。

题外话:旧版xcode适当配置之后,也可以调试装有新版系统的真机或模拟器。当然这是另外一个问题了。我已经在另外一篇文章发表过看法,需要的可以查看什么情况下该升级xcode编译器?

知识共享许可协议本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,请务必在遵守许可协议的前提下转载。
发布时间:2018-11-21 16:47:03 阅读:909 标签:技术