包括框架模块内的非模块化标头

我用的是Xcode6,

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

2)然后我创建了一个Cocoa Touch框架,并添加了这个动态库(CoreLibrary)。

3)然后这个框架被添加到我的项目中,它在requestPoster.H文件(corelibrary)中出现错误。

错误:在框架模块中包含非模块化标头 班级:

IFADDRS.H,ARPA/INET.H,SYS/TYPES.H>

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

140004 次浏览

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

真正的答案是,库所有者需要更改导入的位置。这些文件ifaddrs.H,ARPA/inet.H,sys/types.H被导入到框架中的.H文件中,这是Xcode不喜欢的。库维护人员应将它们移动到.m文件中。例如,请参阅GitHub上的这个问题,其中AFNetworking修复了相同的问题:https://github.com/AFNetworking/AFNetworking/issues/2205

您可以在“构建设置”中将受影响目标的允许在框架模块中包含非模块化内容设置为“是”。这是您需要编辑的生成设置:

Build Settings item you need to edit

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

#import <Foo/Bar.h> // referred to in two or more dependent files

如果将允许在框架模块中包含非模块化组件设置为会导致一组“ X is an ambiguous reference ”(X是不明确的引用)错误或类似错误,则您应该能够跟踪并消除引起问题的重复项。清理代码后,将允许在框架模块中包含非模块化组件重新设置为不是

实际上,解决此问题的更简单方法是将#import语句移到.m文件的顶部(而不是将其放在.h头文件中)。这样,它就不会抱怨它包含了一个非模块化头文件。我遇到过这样的问题:Allow non-module includes设置为YES,而不是对我有效,因此通过将其移动到实现文件,它停止了抱怨。无论如何,这实际上是导入和包含头文件的首选方式。完成此操作后,应将其设置回NO

理想情况下,我们应该尝试将Allow non-module includes设置为NO。在大多数情况下,将此设置为YES意味着您正在执行错误操作。该设置转换为“允许在磁盘上导入不属于模块的随机头文件”。这适用于实践中的极少数用例,因此此设置应始终NO(即默认值)。

“包括框架模块内的非模块化标头”

当您遇到此错误时,在某些情况下,解决方案可以简单地在文件检查器“目标成员”中将您尝试导入的文件标记为“公共”。默认值为“ Project ”,当以这种方式设置时,可能会导致此错误。例如,我在尝试将Google Analytic的标题导入到框架中时就遇到了这种情况。

我也有同样的问题,上面没有任何帮助。所以我希望我的回答能对某些人有所帮助。在我的例子中,问题是总是_搜索_用户_路径设置。当它被设置为没有项目建立和工作正常。但由于其中一个POD要求将其设置为“是”,我收到了一个错误。

包括框架模块内的非模块化标头

在喝了几杯咖啡并进行了一整天的研究后,我发现根据_ABC_的已知问题0:

•如果出现错误,说明内部包含非模块化标头 框架模块对于以前编译的框架,请确保 “始终搜索用户路径”生成设置设置为“否”。这个 仅出于传统原因,默认值为“是”。(22784786)

虽然我使用的是Xcode7.3,但似乎这个错误还没有被修复。

这对我来说是一个恼人的问题。似乎没有建议帮助我的特殊情况,因为我需要在我的个人文件头文件中包含“非模块化”头文件。我使用的解决方法是将导入调用放在前缀头文件中。

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

转到“框架”->“目标”->“构建阶段”,然后拖动以将相关头文件从项目移动到公共。希望对你有帮助!

Screenshot

我有同样的问题,并解决它只是使标题文件公开。 [problem]

如果您正在处理项目中的多个模块。那么您的头文件必须是公共的,才能在项目的其他部分中使用。您需要的是选择该头文件,并在项目实用程序视图中。将文件从“项目/私有”更改为“公共”。见下图:

Changing header file scope

同样的问题让我抓狂。最后,我把import xxx.h而不是接口放在实现中,可以解决这个问题。如果您使用CocoaPods来管理您的项目,您可以添加:

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

.podspec文件中。

如果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

_1生成_ABC时,如果在伞头中看到此错误,请确保将文件导入为:

#import "MyFile.h"

以及作为#import <MyFramework/MyFile.h>

通过使用GitClean,我可以清除几十个这样的错误。下面是命令:git clean -dffx && git reset --hard

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

为什么会这样?

如果您在模块.模块映射中提到的任何公共头文件具有_ModuleMap中提到的ABC_1的导入语句,则会显示错误。由于它试图导入一些未声明为模块化的头文件(在Module.ModuleMap中),因此它破坏了框架的模块性。

我怎么才能修好它?

只需将给出错误的标头包含到您的Module.ModuleMap中,然后重新构建!

为什么不直接将“允许非模块化”设置为“是”?

因为它不是一个真正的解决方案,你告诉你的项目,这个框架应该是模块化的,但它不是。无论如何,我不在乎。";这并不能解决库的模块化问题。

有关更多信息,请查看此已存档的博客文章或参阅铿锵文件

在检查了上述解决方案后,我最终将伞形标题移到了标题列表的底部,这在Xcode9.3中是可行的。

我解决了这个问题,从框架中删除了Modules文件夹。

  • 使用Finder浏览到应用程序项目中存在的框架位置

  • 进入Test.framework文件夹(在上述情况下,它将CoreLibrary.framework)&;删除Modules文件夹。

  • 清理并重新构建应用程序,这将解决问题。

在我的例子中,我忘记在.podspecs文件的“.source_文件”部分添加.H和.m文件。

在添加这个之后,它工作得很好。

enter image description here

我也遇到了这个问题,最初以为这是CocoaPods的问题,但这是应用程序构建设置中的一个问题,有人(可能是我)在标题搜索路径中设置了${PODS_ROOT},并将其设置为recursive搜索。这使得它可以找到在构建应用程序时不打算使用的标题。一旦我设置为使用non-recursive,一切都很好。使用recursive搜索是一个可怕的黑客尝试找到正确的标题。吸取教训。

Allow Non-modular Includes in Framework Modules只适用于ObjC代码。不是在斯威夫特工作。

经过一段时间的研究,我发现Swift可以向Clang传递警告参数,所以将OTHER_SWIFT_FLAGS设置为-Xcc -Wno-error=non-modular-include-in-framework-module,禁止Swift导入错误。

只是为了有同样问题的人。

尝试@import FrameworkName,而不是#import "FrameworkName.h"

我也有类似的问题。当运行我的应用程序目标时,一切工作正常,但当更改为测试目标并尝试运行测试时,“在框架模块中包含非模块化标头”出现错误。我尝试了贴在这里的所有解决方案,但没有一个有效。最后,我浏览了所有的构建设置,对于每一个与标题相关的设置,我都阅读了描述。

USE_HEADERMAP切换到NO就成功了!

我希望任何人都能发现这是有帮助的!

当我将Swift源代码添加到现有的ObjC静态框架(具有Mach-O类型的动态框架";静态库";)时,我遇到了这个问题。

修复方法是将_ABC_设置为0(启用模块在构建设置中)YES

我在动态框架(Swift和Objective-C的混合)的伞头中遇到了这个错误。公共标头目录具有相同的名称作为框架本身。将其重命名为PublicHeaders确实起到了作用(头仍然作为#import <FrameworkName/Header.h>包含)。

我对这个案子的清单:

  • 设置Target Membership=Public,用于伞状表头和从中导入的所有表头
  • 设置Enable Modules (C and Objective-C)=YES
  • 确保公共标头位于哪个名字不一样?框架名称的目录中

在我的例子中,因为你公开地暴露的每个头都被你的伞头看到了。

修复方法是只使用名称,如:

#import "my-public-file.h"

代替:

#import "my-path/added-to/header-search-paths/for/my-public-file.h"