Swift框架:没有找到Umbrella标题'[...].h'

Tim*_*eit 107 ios ios-frameworks swift

在包含Objective-CSwift代码的自定义框架中,Swift编译器抛出以下错误:

[build_path]/unextended-module.modulemap:2:19: error: umbrella header 'bugtest.h' not found
  umbrella header "bugtest.h"
                  ^
<unknown>:0: error: could not build Objective-C module 'bugtest'
Run Code Online (Sandbox Code Playgroud)

art*_*gor 219

这通常发生在项目重命名之后或类似的事情之后.问题是伞标题不再列为公共标题.检查附加的图像以查看如何解决此问题.

固定

  • 对我来说 - 访问级别是公开的,但它也没有找到伞.我确实将"构建阶段"的"标题"部分移到了顶部并开始工作. (14认同)
  • 只是给未来读者一个注意事项,即要查看"构建阶段"的"标题"部分,您需要点击Pod目标.主应用目标不会列出"标题"部分. (6认同)
  • 我的伞头已经公开了.将该部分移到顶部也没有帮助. (4认同)
  • 这完全解决了它.谢谢.这应该是批准的答案. (3认同)

Cla*_*ule 43

在XCode 7 Beta中,使用Swift2,如果您的Framework Header未被声明为"Public",也会发生这种情况.

例如,我有一个Cocoa Touch Framework,头文件的"Project"可见性,以及我的项目中所有swift文件的错误"Umbrella Header ... not found",一旦我有标题"Public",错误消失了


Cla*_*sen 38

这有四种不同的方式可以发生,忽略了以前版本的Xcode中的错误

  • 您的项目中没有名为$(TARGET_NAME).h的伞状头
  • 你有一个伞头,但它没有设置为公开.见arturgrigor的答案
  • DEFINES_MODULE 未设置为 YES
  • CLANG_ENABLE_MODULES 未设置为 YES

  • 我在此列表中正确设置了所有内容,但失败了。 (3认同)
  • 我刚刚发现的第5个原因:不能在任何目标中检查rainbella_header.h本身(就像Info.plist一样) (2认同)

Tim*_*eit 25

Always Search User Paths为Framework目标启用该设置时,会发生这种情况.

将其设置为No将解决该错误.

恕我直言,这是Swift编译器中的一个错误,我已经向Apple提交了一个雷达.
rdar:// 21038443

  • 我已经设置为No,所以没有修复任何东西.:( (4认同)

Ale*_*aev 18

对我来说 - 访问级别是公开的,但它也没有找到伞.我确实将"构建阶段"的"标题"部分移到了顶部并开始工作.podfile的脚本:

post_install do |installer|
installer.pods_project.targets.each do |target|
    phase_name = 'Headers'
    target.build_phases.each do |phase|
        if (phase.display_name.include? phase_name)
            target.build_phases.unshift(phase).uniq! unless target.build_phases.first == phase
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

不知道为什么会这样.试图虚拟项目 - 没有发生.仅适用于具有多个依赖关系的大型问题.在复制伞形头之前编译的东西.

  • 在"编译源"之上移动"标题"对我有用.xCode 8.2.1. (4认同)

Bar*_*zyk 12

当然你必须将你的框架设置为公共:

在此输入图像描述


xyS*_*rma 7

对我来说,将"使用标题地图"设置为"否"可以解决问题


Dan*_*nra 7

还有一个解决方案:重命名文件夹后,即使您通过Xcode的侧栏更新了位置,旧位置仍可能会列在.h文件的项目文件中.这个旧位置导致伞头错误.

简单的解决方案:删除对.h文件的引用,然后重新添加.(然后记得再次公开!)


Max*_*eod 5

这里已经有一些很好的答案了。@Shadow_x99 非常有帮助。不过,如果可以让我补充一下我自己的经验的话。

伞形标头在构建过程中自动识别。它不是在目标的构建设置中指定的,也不是从项目设置继承的。

因此,为了避免此错误,从 XCode 7 开始,如下所示:

warning: no umbrella header found for target 'MyTarget', module map will not be generated

必须采取两个重要步骤。

首先,伞头必须与目标具有相同的名称。因此,如果您的目标是名为 的框架MyTarget,则必须有一个名为 的标头MyTarget.h

其次,在构建阶段- 正如该答案中提到的 - 该头文件必须在公共部分MyTarget中列出,如上所述。


Jon*_*an. 5

我发现随着 New Swift Build System 和 Parallelize Build 打开该方案,我会得到类似这个问题的错误。解决方案是链接到在 swift 源文件中导入的框架。(我认为以前该应用程序会构建,因为恰巧框架已链接到先前在串行构建队列中构建的某些内容)。

我编写了一个脚本来检查工作区中所有目标中的所有导入,并确保它们的框架已链接到该目标中。

https://github.com/Jon889/SwiftImportChecker