Include of non-modular header inside framework module
Include of non-modular header inside framework module
在进行Framework化的过程中,一旦引用了某些Framework其使用者Project,就会报错
HttpHelper.h:10:9: error : include of non-modular header inside framework module 'Ware.HttpHelper': '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.3.sdk/usr/include/CommonCrypto/CommonHMAC.h'
[-Werror,-Wnon-modular-include-in-framework-module] #import <CommonCrypto/CommonHMAC.h>
提醒你 在Framework Module中加载了非当前Module的头文件
处理方法
处理方法有两种,一种是基于LLVM的配置,一种是手动梳理头文件
Allow Non-modular Include
根据StackOverflow的回答可以通过
- Build Setting — Apple LLVM 8.1 Language Modules — Allow Non-modular Includes In Framework Modules
设置为YES,则可以在Framework中使用模块外的Include,不过这种过于粗暴
检查头文件引用关系
根据下文产生原因的分析,其本质原因类似C++文件file not found的加载与编译,是因为不同语言之间的头文件引用混乱产生的
手工检查头文件引用关系,特别是 Umbrella Header File中 不要引用Include 了 C/C++ 头文件的OC头文件 作为子模块放出
产生原因
关注点集中于 #import
与UIKit这样的Framework不同,CommonCrypto 是 C模块 ,也就是说其头文件 CommonHMAC.h 不应该伴随 SomeHeader.h 头文件对外暴露
- Target.app 引用了 SharedFrame.framework的Umbrella头文件 SharedFrame.h
- Umbrella头文件中包含了 SomeHeader.h
- HttpHelper.h 中暴露了 CommonCrypto 的 CommonHMAC.h
- 对于 SharedFrame.framework的Scope, 内部二进制包含有 CommonCrypto 模块的代码,CommonHMAC.h有效
- 对于 Target.app的Scope, 不确定SharedFrame.h内部引用 HttpHelper.h 是否包含CommonCrypto 模块的代码
- Target.app 判定
为模块外Header File报错
修改方法:
在 SharedFrame.h 中删除 #import
Include of non-modular header inside framework module
http://chenzhao.date/2020/12/01/Include of non-modular header inside framework module.html
install_url
to use ShareThis. Please set it in _config.yml
.