升级CocoaLumberjack至3.6.0后遇非模块化头文件错误求助
嘿,我之前也碰到过几乎一模一样的问题,给你整理几个亲测有效的解决办法,按顺序试试应该能搞定:
先说说问题根源
你因为XMPPFramework的依赖,通过CocoaPods装了CocoaLumberjack,升级到3.6.0后触发了一堆非模块化头文件的致命错误,比如:
Include of non-modular header inside framework module 'CocoaLumberjack.DDAbstractDatabaseLogger': '/xxx/Pods/Headers/Public/CocoaLumberjack/DDLog.h'
你试过开启Allow Non-modular Includes in Framework Modules但没用,苹果论坛的说法是对的——这是CocoaPods生成的头文件搜索路径搞的鬼,而且这个设置对Swift项目完全不适用(就算能用也不安全,Swift依赖模块信息做调试支持)。
具体解决步骤
1. 先彻底清理CocoaPods缓存重装
很多时候是旧缓存的路径冲突导致的,先执行这几条命令彻底清一遍:
pod deintegrate pod clean rm -rf Podfile.lock pod install
这个操作会把现有Pods完全移除,清空缓存,然后重新拉取最新的依赖,大部分情况下这个操作就能解决问题。
2. 强制CocoaLumberjack以静态库形式集成
如果清理没用,试试在Podfile里给CocoaLumberjack加个静态库的配置:
pod 'CocoaLumberjack', '3.6.0' do use_frameworks! :linkage => :static end
然后重新跑pod install。动态库的模块化规则容易和CocoaPods的路径冲突,改成静态库集成就能绕过这个问题,这是我当时解决问题的关键步骤。
3. 手动修正头文件引用路径(迫不得已再用)
要是上面的方法都不行,你可以直接改CocoaLumberjack里的头文件引用:
找到报错的那些文件(比如DDAbstractDatabaseLogger.h),把里面的绝对路径引用改成相对路径或者直接引用文件名,比如把:
#include "/xxx/Pods/Headers/Public/CocoaLumberjack/DDLog.h"
改成:
#import "DDLog.h"
注意:这个方法的缺点是下次pod update的时候你的修改会被覆盖,所以最好配合patch工具来保存修改,或者等官方修复这个问题。
4. 临时回退到稳定版本
如果急着赶项目,也可以先回退到之前能用的旧版本,比如在Podfile里指定:
pod 'CocoaLumberjack', '~> 3.5.0' # 换成你之前正常使用的版本号
等后续CocoaLumberjack官方修复了模块化的问题,再升级到最新版就好。
内容的提问来源于stack exchange,提问作者roger Y

