xcode 10 坑
iOS12的发布,带来了老设备性能提升,增强稳定性,更多是为了稳住果粉,更多是挽回被bugOS11坑苦的名声。
为了尝鲜,也为了尝试下iOS12新特性,许多人升级了Xcode10beta版,而现在正式版已经发布,很多人也应该升级了。本文针对升级Xcode10后会遇到的某些坑做了一点总结,希望能帮助到读者。
首先,如果不想踩坑想用Xcode9挣扎几年,这也可以,不过早晚都得升只不过早升还是晚升的问题,Mojave以及Xcode10、iOS12带来的新技术也就享用不到了。如果你要升级,那么首要解决的就是以下几个问题。
一、libstdc++.6.0.9.tbd 文件问题
15372477451157.jpg这个错误原因是因为iOS12.0中去掉了lstdc++.6.0.9.tbd动态库,如下图在Xcode9中搜索便知:
iOS12.0中全部采用libc++代替lstdc++的动态库(如下图):
此处搜索在TARGETS/Build Phases/Link Binary With Libraries中点"+",就可以搜索了。
解决办法
针对于此问题的解决,有几个思路,第一就是吧libstdc++换成libc++,当然这涉及到了不少东西都需要重新去适配,各个依赖的bundle都需要去做。
为了方便,最简单去应付一下就是找到一个能用的Xcode9,进入
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib
目录下,拷贝一份libstdc++.6.tbd和libstdc++.6.0.9.tbd到同路径的Xcode10当中,此时真机调试就没有问题了。此处可以下载附件中编译目录libstdc.zip放入xcode10如上目录下。
拷贝libstdc++之后就可以编译通过了,但App在模拟器里一运行就崩溃,就会报动态链接库装载出错,错提示会是libstdc++.dylib与这个模拟器不符合。那是因为复制到Xcode10中的tbd文件描述的是libstdc++的真实路径,这个在模拟器中是缺失的,拷贝过去的文件也不是给模拟器用的,所以如果非要用模拟器还需要去
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib
模拟器路径进行一次拷贝。要不然就只能用iOS11的模拟器去凑合一下忍忍了。此处可以下载附件中模拟器目录libstdc.zip放入xcode10如上目录下。
关于libc++和libstdc++
libc++为LLVM项目重新编写,包含C++11标准库。如smart pointer,function,tuple,unordered_map,unordered_set等。这些库简化了代码。另外libc++支持move语意,速度也有加快。
libstdc++是GUN项目的标准库。虽然新版本也支持C++11,但是Apple中默认的gcc版本确是旧的,不支持新的标准库特性。
几年前,Apple就有意识的去GUN了,不过在Xcode10中做的非常坚决。此处可参考LLVM编译工具链相关文章。
Xcode10中libstdc++相关的3个库(libstdc++、libstdc++.6、libstdc++6.0.9)应该都是被彻底废弃了。
二、提示info.plist重复问题
这个是小问题,如果重复文件是其他部门有依赖,所以修改了xcode的配置暂时解决了编译报错的问题。
参考Stack Overflow中Xcode 10 Error: Multiple commands produce,修改Xcode编译配置
Xcode->File->Project Settings/Workspace Setting-> Build System -> Legacy Build System
这里定义为临时解决方案的原因是:使用了Xcode10编译的新特性而抛出错误,既然是编译器的特性,那么最好还是接受它的报错去修复。作为短暂的过渡使用老的编译方式是可以的,长期我个人觉得是不合适的。
三、Multiple commands produce错误
这个问题可以在stackoverflow上找到,大致的解决方法有两种
一种就是在“Target/Build Phases/”中清除Compile Suorces与Copy Bundle Resources内容,但是后面会出现You don't have permission错误,所以最好别用。
另外一种还是和上一条问题类似,
Xcode->File->Project Settings/Workspace Setting-> Build System -> Legacy Build System
四、Build System中的命令行工具参数长度减小
Xcode10命令行工具重新进行了优化,其中Build System中入参长度再一次减小,TaobaoEnv中执行pod install或者pod update后头文件也都写入到了Header Search Path里,然后这个参数的长度就呵呵了。一般
${PODS_ROOT}/Headers/Public/xxxx
这种格式的是Cocoapods生成的,
$(PODS_ROOT)/xxxx/xxxx.framework/Headers
#import "xxx.h"
变成
#import <xxxx/xxx.h>
的形式。
如果有其他坑持续更新,欢迎大家一起交流。
此处附赠设备表链接一份,供大家参考https://www.theiphonewiki.com/wiki/Models