Xcode10关于libstdc++以及导出ipa报错

        最近几个月打包上架的时候苹果会提醒:WARNING ITMS-90725: "SDK Version Issue. This app was built with the iOS 11.2 SDK. 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月开始,提交到App Store的所有iOS应用程序必须使用iOS 12.1 SDK或更高版本构建,包含在Xcode 10.1或更高版本中。迫不得己,今天将Xcode由9.3版本升级到10.1版本。

        我升级版本后运行项目就报了一个Multiple commands produce'/Users/mc/Library/Developer/Xcode/DerivedData/......的错误。这个的原因是项目中使用第三方库,里面有Info.plist之类的,而且是不止一个库中有,重复的这些文件,导致的报错。或者项目中重复引用同一个文件图片所导致的。这个错误的解决方法是:修改build system在Xcode菜单栏 -> File -> Workspace Setting,将build system修改为legacy build system。如下图所示:

选择Workspace Settings
Xcode10关于libstdc++以及导出ipa报错_第1张图片
上下两个选项都改成Legacy Build System

clean后编译后就到了这篇文章的重点。报缺少libstdc++.6.0.9的错误。如下图:

缺少libstdc++.6.0.9

        原因是苹果在 XCode10 和 iOS12 中移除了 libstdc++ 这个库,由 libc++ 这个库取而代之,苹果的解释是 libstdc++ 已经标记为废弃有5年了,建议大家使用经过了 llvm 优化过并且全面支持C++11的 libc++ 库。

        我们只需要在Xcode10的真机和模拟器目录里放置缺失的 .tbd 文件。刚一开始我只放置了libstdc++.6.0.9.tbd这一个文件,真机运行可以,但是Xcode10自带的iOS12模拟器一运行就崩溃,就会报动态链接库装载出错,看出错提示说是 .dylib 与这个模拟器不符合。这个时候我们就需要放置两种文件在模拟器目录里的两个地方。

        将libstdc++_sim.zip解压放置在:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/目录下;

        将libstdc++.dylib_sim.zip解压放置在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/目录下。这样的话项目就可以完美的运行在Xcode10上面了。

        谷歌上大牛对待此报错的解决办法是:“如果你自己的业务模块使用了 libstdc++ ,那么就把模块代码重新调整为依赖 libc++ ,然后重新检查是否存在问题,重新编译;如果你引用的三方库使用了 libstdc++ ,那么向三方库寻求支持,进行升级。”

        项目运行起来之后我尝试打一个测试ipa包,导出的时候报了一个这样的错误:ipatool failed with an exception: #NonZeroExcitException: Command exited with pid 32176......如下图所示:

Xcode10关于libstdc++以及导出ipa报错_第2张图片
导出包报错

        此时我们只需在Xcode打包时取消选择:Rebuild from Bitcode(Export your app by compiling the bitcode in the same way the App Store does.)即可。据说是因为Xcode9默认已经开启了Bitcode功能,所以后续Bitcode需要关闭了才可以。因此要打包时要取消勾选:Rebuild from Bitcode。取消项如下图所示:

Xcode10关于libstdc++以及导出ipa报错_第3张图片
取消勾选Rebuild from Bitcode


还有另外一种方法,参见GitHub开源项目:https://github.com/devdawei/libstdc-

以上就是本人Xcode10初体验。

你可能感兴趣的:(Xcode10关于libstdc++以及导出ipa报错)