在框架模块中包含非模块化头

Dev*_*Dev 127 cocoa-touch objective-c

我正在使用Xcode 6,

1)首先,我正在创建一个动态库(CoreLibrary).该库包含RequestPoster.h文件.

2)然后我创建了一个Cocoa Touch Framework并添加了这个动态库(CoreLibrary).

3)然后在我的项目中添加此框架,它在RequestPoster.h文件(CoreLibrary)中给出错误.

错误:在框架模块类中包含非模块化头:

ifaddrs.h,arpa/inet.h,sys/types.h>

在项目中找不到这些文件.

bca*_*tle 179

尝试在"目标"下进行构建设置,并将"允许框架模块中的非模块化包含"设置为"是".

真正的答案是图书馆所有者需要更改导入的位置.那些文件ifaddrs.h,arpa/inet.h,sys/types.h被导入到框架中的.h文件中,Xcode不喜欢它.库维护者应将它们移动到.m文件.例如,在GitHub上查看此问题,其中AFNetworking修复了同样的问题:https://github.com/AFNetworking/AFNetworking/issues/2205

  • 您能否解释一下更改的影响:允许框架模块中的非模块化包含 (4认同)
  • 如果有错误的标题使用了导入标题中的类型,建议使用什么?例如,如果模块中的header module.h声明了一个带有`ifaddrs`类型参数的函数,则它们必须导入ifaddrs.h. (2认同)

Lon*_*ham 130

确保头文件作为框架的公共头文件的一部分公开可用.

转到框架 - >目标 - >构建阶段并拖动以将相关的头文件从Project移动到Public.希望有所帮助!

截图

  • 这帮助我将 Objective C 代码包含到 Swift 框架中,谢谢! (4认同)
  • 这是这个问题的正确解决方案 (4认同)
  • 您还可以使用 XCode 主屏幕右侧的文件检查器窗口将文件中的目标成员资格从项目更改为公共。 (3认同)
  • 这正是我所需要的.谢谢! (2认同)

小智 70

您可以将受影响目标的构建设置中的框架模块中的允许非模块化包含设置为YES.这是您需要编辑的构建设置:

您需要编辑的构建设置项

注意:您应该使用此功能来发现潜在的错误,我发现这些错误通常是由具有某种依赖关系的文件中的角度括号全局包含的重复引起的,即:

#import <Foo/Bar.h> // referred to in two or more dependent files
Run Code Online (Sandbox Code Playgroud)

如果将" 允许非模块化包含在帧模块"设置为"是",则会导致出现一组"X是模糊参考"错误或类似错误,您应该能够追踪有问题的副本并将其消除.清除代码后,将" 允许框架模块中的非模块化包含"设置为" 否".

  • 我无法找到任何"含糊不清的参考"警告.将它设置为**YES**有什么缺点? (2认同)

Saa*_*aad 23

我有同样的问题,只需将头文件公开即可解决. [问题]

如果您正在处理项目中的多个模块.然后您的头文件需要公开才能在项目的其他部分中使用.您需要的是选择该头文件,并在项目Utilities视图中.将文件从Project/Private更改为Public.见下图:

更改头文件范围


Joh*_*ell 19

"在框架模块中包含非模块化头"

当您收到此错误时,解决方案在某些情况下可以简单地将您尝试导入的文件标记为文件检查器"目标成员身份"中的"公共".默认为"Project",当以这种方式设置时,它可能导致此错误.例如,当我尝试将Google Analytic的标头导入框架时就是这种情况.


Sol*_*ing 19

Allow Non-modular Includes in Framework Modules仅适用于 objc 代码。不能快速工作。

经过一段时间的研究,我发现swift可以将warning参数传递给clang,所以设置OTHER_SWIFT_FLAGS-Xcc -Wno-error=non-modular-include-in-framework-module抑制swift导入错误。

只为有同样问题的人


str*_*mes 16

实际上,一种更简单的解决方法是将#import语句移动到.m文件的顶部(而不是将其放在.h头文件中).这样它就不会抱怨它包含一个非模块化的头文件.我有这个问题,即Allow non-module includes设定为YES没有为我工作,所以通过其移动到实现文件,它停止抱怨.事实上,这是导入和包含头文件的首选方式.完成此操作后,将其设置为NO可行.

理想情况下,我们应该尝试并Allow non-module includes设定目标NO.YES在大多数情况下将此设置为意味着您做错了什么.该设置转换为"允许在磁盘上导入不属于模块的随机头文件".这适用于极少数的使用情况在实践中,所以此设置应始终NO(即默认值).


Mer*_*lik 8

如果您正在开发自己的框架:

为什么会发生这种情况?

如果您在module.modulemap中提到的任何公共头文件具有modulemap提及的import语句,则会出现错误.由于它试图导入一些未声明为模块化的头文件(在module.modulemap中),因此它破坏了框架的模块性.

我该如何解决?

只需将包含错误的标题包含在module.modulemap中并再次构建!

为什么不设置允许非模块化为YES?

因为它不是真正的解决方案,所以你告诉你的项目"这个框架应该是模块化的,但事实并非如此.以某种方式使用它,我不在乎." 这不能解决您的库的模块化问题.

有关更多信息,请查看此博客文章或参阅clang文档.


小智 7

同样的问题让人抓狂。最后,我发现将“import xxx.h”放在实现中而不是接口可以解决问题。如果您使用 Cocoapods 来管理您的项目。您可以添加

s.user_target_xcconfig = { 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES' }

在您的“xxx.podspec”文件中。


iyu*_*una 5

我有同样的问题,上面的任何内容都没有帮助我.所以我希望我的回答对某些人有帮助.就我而言,问题出在ALWAYS_SEARCH_USER_PATHS设置中.当它被设置为NO项目建立和工作正常.但是,如果其中一个pod要求将其设置为YES,则表示我收到了错误消息

在框架模块中包含非模块化头

经过几杯咖啡和一整天的研究,我发现根据Xcode 7.1 Beta 2发布说明的已知问题:

•如果出现以前编译的框架"在框架模块中包含非模块化标头"的错误,请确保"始终搜索用户路径"构建设置设置为"否".出于遗留原因,默认值为"是".(22784786)

我虽然使用的是XCode 7.3,但似乎还没有修复这个bug.


k06*_*06a 5

如果您需要CocoaPods目标,请在以下位置添加以下行Podfile

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      target.build_settings(config.name)['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
    end
  end
end
Run Code Online (Sandbox Code Playgroud)


Mis*_*nko 5

如果在构建动态框架时在伞状标题中看到此错误,请确保将文件导入为:

#import "MyFile.h"

作为#import <MyFramework/MyFile.h>