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


143

我正在使用Xcode 6,

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

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

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

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

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

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

Answers:


190

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

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


2
如果错误的标题使用的是导入的标题中的类型,建议使用什么?例如,如果模块中的标头module.h声明了一个参数类型为的函数ifaddrs,则它们必然会导入ifaddrs.h。
Ayush Goel

但是,如果它们是系统包含的,该/usr/include/libproc.h怎么办?
Ben Leggiero

3
您能否解释一下更改的影响是什么:允许框架模块中包含非模块化的内容
nr5

我认为最好的答案可能是使其成为模块化标头,而不是基本消除此错误。我可以轻松想象苹果删除了允许在模块中使用非模块化接头的选项。
本·莱吉耶罗

170

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

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

屏幕截图


3
那帮助我将Objective C代码包含到Swift框架中,谢谢!
瓦迪姆

1
您还可以通过使用XCode主屏幕右侧的“文件检查器”窗口,将文件中的“目标成员资格”从项目更改为“公共”。
Pigpocket

如果将库导入到swift / objc中,则还需要确保桥接头也是公共的。我犯了错误!
尼克H247

74

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

您需要编辑的构建设置项

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

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

如果将帧模块中的允许非模块化包含设置为“是”,则会导致出现一系列“ X是歧义引用”错误或类似的错误,那么您应该能够找出有问题的重复项并消除它们。清理代码后,将“ 框架模块”中的“允许非模块化包含”设置为NO


1
好的,这是引起问题的尖括号!我在CocoaPods导入中遇到此问题,并通过将导入更改为使用引号而不是尖括号来解决此问题。
Michael Forrest 2015年

糟糕,不,不是。我清理完项目后发现它坏了:-/
Michael Forrest

2
我找不到任何“模棱两可的参考”警告。将其设置为YES有什么缺点?
Nicolas Miari

28

我有同样的问题,只是通过公开头文件来解决。 [问题]

如果您正在项目中的多个模块上工作。然后,您的头文件需要公开才能在项目的其他部分中使用。您需要在项目实用程序视图中选择该头文件。将文件从项目/专用更改为公共。见下图:

更改头文件范围


尤其是当您复制现有的公共标头时,重复的标头成员资格更改为“项目”
Jeremie

不,对于复制品不是强制性的。它可能由于不同的情况而发生,例如,如果您完全将某些项目作为库导入到项目中,然后尝试修改私有类。您知道并写入了头文件,但是访问权限并非对所有项目都是公共的。
萨德

22

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

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


这个答案对我类似的问题大有帮助。我不知道可以将框架头文件添加到目标中。在应用程序项目中,标头永远不是目标的一部分。
生物资料

20

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

理想情况下,我们应该尝试的目标已经Allow non-module includes设定NOYES在大多数情况下将此设置为意味着您做错了什么。该设置将转换为“允许在磁盘上导入原本不是模块一部分的随机头文件”。实际上,这适用于极少数的用例,因此此设置应始终为NO(即默认值)。


10

如果您正在开发自己的框架,请执行以下操作:

为什么会这样?

如果任何您已在提到公共的头文件module.modulemap具有被导入语句不会在modulemap提到的,这会给你的错误。由于它尝试导入一些未声明为模块化的标头(在module.modulemap中),因此破坏了框架的模块化。

我该如何解决?

只需包含将错误提供给您的module.modulemap的标头,然后再次构建!

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

因为这里并不是真正的解决方案,所以您告诉您的项目“该框架应该是模块化的,但不是。应该以某种方式使用它,我不在乎。” 这不能解决您的库的模块化问题。

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


您是如何使用可可项目框架来设置module.modulemap的,我试图让我的库能够处理仅Swift的项目,但是由于该库的一个依赖项,module.modulemap无法正常工作,因此cocoapod是自动生成modulemap,但似乎不起作用,您是否遇到过类似的事情?
Amadeu Cavalcante Filho

8

如果您需要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

7

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

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

只为有同样问题的人


6

我遇到了同样的问题,但上面没有任何帮助。因此,我希望我的回答对某人有所帮助。就我而言,问题出在ALWAYS_SEARCH_USER_PATHS设置中。当它设置为NO时,没有项目可以正常工作。但是就其中一个Pod要求将其设置为YES,我收到了一个错误

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

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

•如果对于先前编译的框架出现错误,指出“在框架模块中包括非模块头,则包括在内”,请确保将“始终搜索用户路径”构建设置设置为“否”。仅出于传统原因,默认值为“是”。(22784786)

虽然我使用的是XCode 7.3,但似乎该错误尚未修复。


6

最后,我发现将'import xxx.h'放在实现中而不是在接口上可以解决问题。如果您使用Cocoapods来管理您的项目,则可以添加

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

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


6

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

#import "MyFile.h"

作为#import <MyFramework/MyFile.h>


2

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


我也可以确认这也是我的问题。
威尔逊·穆尼奥斯

我在PersonalizedAdConsent中遇到了这个问题,并解决了该问题。谢谢!
史蒂芬·埃利奥特

1

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


0

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


0

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

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

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

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



0

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.