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

时间:2015-01-05 09:22:54

标签: objective-c cocoa-touch

我正在使用Xcode 6,

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

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

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

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

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

项目中找不到这些文件。

23 个答案:

答案 0 :(得分:171)

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

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

答案 1 :(得分:110)

确保头文件作为框架公共标头的一部分公开提供。

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

Screenshot

答案 2 :(得分:69)

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

Build Settings item you need to edit

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

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

如果将允许非模块化包含在框架模块中设置为会导致一组“X是模糊参考”错误或某种类型的错误,您应该能够追踪有问题的副本并消除它们。清理完代码后,将允许非模块化包含在框架模块中设置回

答案 3 :(得分:21)

我遇到了同样的问题,只需将头文件公开即可解决问题。 [problem]

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

Changing header file scope

答案 4 :(得分:15)

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

理想情况下,我们应该尝试将NO设置为YES。在大多数情况下,将此设置为NO意味着您做错了什么。该设置转换为&#34;允许在磁盘上导入随机头文件,否则这些文件不属于模块&#34;。这适用于实际中极少数用例,因此此设置应始终为{{1}}(即默认值)。

答案 5 :(得分:15)

&#34;在框架模块中包含非模块化标头&#34;

当您收到此错误时,解决方案在某些情况下可以简单地将您尝试导入的文件标记为&#34; public&#34;在文件检查员&#34;目标会员&#34;。默认值为&#34; Project&#34;,当以这种方式设置时,它可能导致此错误。例如,当我尝试将Google Analytic的标头导入框架时就是这种情况。

答案 6 :(得分:10)

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

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

仅适用于遇到相同问题的人

答案 7 :(得分:7)

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

为什么会发生这种情况?

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

我该如何解决?

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

为什么不将allow non-modular设置为YES?

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

有关详细信息,请查看此blog post或参阅clang docs

答案 8 :(得分:5)

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

  

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

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

  

•如果您收到错误说明&#34;包含非模块化标头   框架模块&#34;对于以前编译的框架,请确保   &#34;始终搜索用户路径&#34;构建设置设置为&#34;否&#34;。该   默认是&#34;是&#34;仅用于遗留原因。 (22784786)

我当时正在使用XCode 7.3,但似乎这个bug还没有修复。

答案 9 :(得分:4)

同样的问题让人发疯。最后,我发现将导入xxx.h&#39;在实现而不是接口可以解决问题。如果你使用Cocoapods来管理你的项目。你可以添加

  

s.user_target_xcconfig = {&#39; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES&#39; =&GT; &#39; YES&#39; }

在你的&x; xxx.podspec&#39;文件。

答案 10 :(得分:3)

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

答案 11 :(得分:3)

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

#import "MyFile.h"

#import <MyFramework/MyFile.h>

答案 12 :(得分:1)

这对我来说是个烦人的问题。没有任何建议似乎有助于我的特定情况,因为我需要在我的个人文件头文件中包含“非模块化”标头。我使用的工作是将导入调用粘贴在前缀头文件中。

答案 13 :(得分:1)

我也遇到了这个问题,最初以为是CocoaPods问题,但这是应用程序构建设置中的一个问题,有人(可能是我)在Header Search Paths中设置了${PODS_ROOT}并将其设置为是recursive搜索。这允许它查找在构建应用程序时不打算使用的标头。一旦将其设置为使用non-recursive,一切都很好。使用recursive搜索是试图找到正确的标头的可怕技巧。经验教训。

答案 14 :(得分:0)

我在动态框架(Swift 和 Objective-C 的混合)的伞头中遇到了这个错误。公共头文件目录与框架本身同名。将其重命名为 PublicHeaders 可以解决问题(标题仍包含为 #import <FrameworkName/Header.h>)。

我对这个案例的检查清单:

  • 设置 Target Membership = Public 为伞头和所有从它导入的头
  • set Enable Modules (C and Objective-C) = YES
  • 确保公共标头位于名称不同于框架名称的目录中

答案 15 :(得分:0)

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

修复是将 CLANG_ENABLE_MODULES(构建设置中的“启用模块”)设置为 YES

答案 16 :(得分:0)

我遇到类似的问题!当运行我的应用程序目标时,一切工作正常,但是当更改为测试目标并尝试运行测试时,出现“在框架模块中包含非模块化头文件”错误。我尝试了此处发布的所有解决方案,但没有一个起作用。最后,我滚动浏览了所有构建设置,并为每个与标题相关的设置阅读了说明。

USE_HEADERMAP切换为NO就可以了!

我希望任何人都能找到帮助!

答案 17 :(得分:0)

就我而言,因为您公开公开的每个标题都会被您的伞头看到;

解决方法是简单地使用仅名称,例如:

#import "my-public-file.h"

代替:

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

答案 18 :(得分:0)

尝试用@import FrameworkName代替#import "FrameworkName.h"

答案 19 :(得分:0)

在我的情况下,我忘记在.podspecs文件的“ s.source_files”部分中添加.h和.m文件。

将其添加到其中后可以正常工作。

enter image description here

答案 20 :(得分:0)

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

  • 使用查找器浏览到App Project中存在的框架位置

  • 进入Test.framework文件夹(在上述情况下为CoreLibrary.framework)并删除Modules文件夹。

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

答案 21 :(得分:0)

在检查了上述解决方案之后,我最终将Umbrella Header移到Headers列表的底部,并且在Xcode 9.3中有效。

答案 22 :(得分:-1)

我能够通过使用Git clean来清除这些错误。这是命令:main.js