吐槽:
很就没做iOS开发了,这两天搞个Demo练练手,swift-oc混编的项目,XCode10.1。一开始,一切都OK的,但是,当我clean(实际上默认是Clean Build Folder)之后,编译就一直报错'Demo-Swift.h' file not found!!!WTF??然后网上各种找答案,各种搞!鬼使神差,也不知道弄了啥,又能编译了!
然后,今天重新打开项目编译,又报错'Demo-Swift.h' file not found!!!我草泥马啊!不得不爆粗口!苹果把这个混编改得这么烂!之前XCode8,9,一直用啊,怎么clean啊,怎么搞都完全没问题!
最后找到了解决办法,但也只是权宜之计(可以放心用,就是很麻烦)。
解决过程:
实际上,我们项目编译之后,在项目目录下是看不到'xxx-Swift.h'文件的。因为这个文件是自动生成在/Users/XXXXXX/Library/Developer/Xcode/DerivedData/Demo-cuikoynpwnwfycfwyyisctpjtahd/Build/Intermediates.noindex/Demo.build/Debug-iphoneos/Demo.build/Objects-normal/arm64目录下的。
- Library就是【资源库】目录。
- Demo-cuikoynpwnwfycfwyyisctpjtahd是自动生成的[项目名]+[一长串字符串](每次编译生成的名称不变!)
这个就是我们项目编译后输出的目录,你手动删除,再编译,又会再次生成。 - 当我们执行clean的时候,就会把Demo.build/Debug-iphoneos/Demo.build里面大部分数据清空了!包括删掉了Objects-normal目录!这就导致了'xxx-Swift.h'连带被删除了!这个时候我们再去编译,就会报错的!因为它确实是不存在!
解决的办法是,先把代码里面的 import 'xxx-Swift.h' 屏蔽,以及相关混编纠缠报错的代码都屏蔽,先让编译成功!编译成功才能生成Demo.build目录下的内容,包括'xxx-Swift.h'。当编译输出拥有了'xxx-Swift.h'之后,再重新打开之前屏蔽掉的混编的代码(import 'xxx-Swift.h'等)。 - 到这里,可能还是报错'Demo-Swift.h' file not found。这时就需要把arm64目录,也就是
(注意不是Header Search Paths),目录示例:
/Users/XXXXXX/Library/Developer/Xcode/DerivedData/Demo-cuikoynpwnwfycfwyyisctpjtahd/Build/Intermediates.noindex/Demo.build/Debug-iphoneos/Demo.build/Objects-normal/arm64
这时,再编译,就可以了。
如果不添加User Header Search Paths,直接把Demo-Swift.h文件拷贝到项目根目录,也可以编译通过。。。
综上,第一步要确保Library.../Demo.build目录下有Demo-Swift.h文件;第二步,要确保User Header Search Paths能包含该头文件的路径,或者直接把该文件拷贝到项目根目录。
之所以说这是权宜之计,是因为一旦我们执行clean|clean build folders,就会把Demo.build目录下(大部分)内容清空,包括会删除'xxx-Swift.h'。而这些目标文件,很多是build success成功才能生成的!!所以必须保证项目代码可以build success,才能再次生成'xxx-Swift.h'!可能需要你屏蔽很多混编代码!这是很麻烦的。
网友评论