Include of non-modular header inside framework module

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 模块为一个系统库

与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 判定 为模块外Header File报错

修改方法:

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

Author

陈昭

Posted on

2020-12-01

Updated on

2021-12-27

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Kommentare

You forgot to set the shortname for Disqus. Please set it in _config.yml.