chenzhao

  • java
  • iOS
  • IT
知识积累
不积跬步无以至千里
  1. 首页
  2. iOS
  3. 正文

Include of non-modular header inside framework module

2020年 12月 1日 104点热度 0人点赞 0条评论

From: https://alanli7991.github.io/2017/07/21/%E6%A8%A1%E5%9D%97%E5%8C%9621Framework%E4%B8%8E%E6%A8%A1%E5%9D%97%E5%A4%96nonmodular%E5%A4%B4%E6%96%87%E4%BB%B6/

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 <CommonCrypto/CommonHMAC.h> 可以发现其 CommonCrypto 模块为一个系统库

与UIKit这样的Framework不同,CommonCrypto 是 C模块 ,也就是说其头文件 CommonHMAC.h 不应该伴随 SomeHeader.h 头文件对外暴露

  1. Target.app 引用了 SharedFrame.framework的Umbrella头文件 SharedFrame.h
  2. Umbrella头文件中包含了 SomeHeader.h
  3. HttpHelper.h 中暴露了 CommonCrypto 的 CommonHMAC.h
  4. 对于 SharedFrame.framework的Scope, 内部二进制包含有 CommonCrypto 模块的代码,CommonHMAC.h有效
  5. 对于 Target.app的Scope, 不确定SharedFrame.h内部引用 HttpHelper.h 是否包含CommonCrypto 模块的代码
  6. Target.app 判定 <CommonCrypto/CommonHMAC.h> 为模块外Header File报错

修改方法:

在 SharedFrame.h 中删除 #import <SharedFrame/HttpHelper.h>, 仅在 Target.app 的.m文件中使用时加载

标签: 暂无
最后更新:2022年 11月 11日

陈昭

IT 程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2022 chenzhao. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang