Swift框架:未找到伞标头'[…] .h'


114

在同时包含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'

Answers:


240

通常在项目重命名或类似的操作之后发生。问题在于伞头不再被列为公共头。检查附件中的图像以查看解决方法。

固定


7
只是给将来的读者一个提示,要想完全看到“构建阶段”的“标题”部分,您需要单击Pod目标。主要应用目标不会列出“标题”部分。
shmim '16

3
这完全解决了它。谢谢。这应该是批准的答案。
Gujamin '16

16
对我来说-访问级别是公开的,但由于找不到伞而失败。我确实将“构建阶段”的“标题”部分移到顶部,并且开始工作。
Aleksei Minaev '16

6
我的伞头已经公开了。将部分移到顶部也无济于事。
拉斐尔·布加杰夫斯基

1
当迦太基更新我的一个导入框架时,我遇到了类似的问题。我想XCode很难注意所引用的框架路径更改。简单的XCode重新启动对我来说解决了这个问题。
托尼

48

在带有Swift 2的Xcode 7 Beta中,如果未将Framework Header声明为“ Public”,也会发生这种情况

例如,我有一个Cocoa Touch Framework,其头文件具有“项目”可见性,而项目中所有Swift文件的错误消息“ Umbrella Header ... not found”,一旦我有了头文件“ Public”,错误消失了


1
就我而言,当我遇到此问题时,此答案似乎是“更正确”的答案,并且对我有用。
greymouser 2015年

1
我同意。这是正确的答案。检查<project> .h文件是否具有正确的目标成员资格和访问级别(公共)。
user965972

@ Shadow_x99我如何将标题设置为“公共”,我的问题发布在stackoverflow.com/questions/36084291/…–
user2727195

这实际上是@arturgrigor答案的一种变体,只是Xcode自己执行更改。最终结果应该相同。
original_username

40

可以通过4种不同的方式发生这种情况,而忽略了先前版本的Xcode中的错误

  • 您的项目中没有名为$(TARGET_NAME).h的保护伞头
  • 您有一个伞头,但未将其设置为公共头。见arturgrigor的答案
  • DEFINES_MODULE 未设置为 YES
  • CLANG_ENABLE_MODULES 未设置为 YES

3
我刚刚发现的第五个原因:不能在任何目标中检查伞
header_header.h]

3
我在此列表中正确设置了所有内容,但失败了。
Erik Aigner '18

25

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

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

恕我直言,这是Swift编译器中的错误,我已经向Apple提出了警告。
参见rdar:// 21038443


1
谢谢!这也是吸引我的那个。
克里斯·哈顿

这对我有用。另一个症状是清洗后立即失败,但如果不清洗就重试成功。
Ben Leggiero

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

不知道为什么会这样。尝试过虚拟项目-不会发生。仅在具有多个依赖项的大型项目上。复制伞头之前需要进行编译。


4
将“标题”移到“编译源”上方对我有用。xCode 8.2.1。
罗伯·帕特森

将标题阶段移到顶部也对我有用。
索伦·莫特森

无效的Podfile文件:语法错误,意外的输入结束,应使用keyword_end。
Volodymyr Kulyk '19


7

对我来说,将“使用标题映射”设置为“否”可以解决此问题


…就我而言,将其设置为YES可解决此问题。不幸的是,似乎没有关于此设置的任何文档,但是默认设置是“是”,并且我不确定为什么我的目标之一将其设置为“否”。
robotspacer

7

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

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


5

我发现在启用了新的Swift Build System和Parallelize Build的情况下,我会得到类似此问题的错误。解决方案是链接到快速源文件中导入的框架。(我认为以前可以构建该应用程序是因为刚好将框架链接到先前在串行构建队列中构建的东西)。

我编写了一个脚本来遍历工作空间中所有目标中的所有导入,并确保已将其框架链接到该目标中。

https://github.com/Jon889/SwiftImportChecker


4

这里已经有一些很好的答案。@ Shadow_x99的帮助很大。但是,如果可以允许我补充自己的经验。

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

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

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

必须采取两个重要步骤。

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

第二,在构建阶段MyTarget(如该答案所述),该头文件必须在公共部分中列出,如上所述。


1

我遇到了同样的问题,建议的答案都无法解决我的问题,因此,如果有人遇到同样的问题,我将在此保留。

我在“构建阶段”中添加了“运行脚本”,但最终将其删除,这就是我开始得到错误的时间。

我的解决方案最终不得不清理项目,重新构建框架,然后正确构建我的应用程序项目。


1

以我的经验,您必须在目标上选择导致错误的框架,而不是项目目标。
然后进行编译,编译后将在项目目标上可用。


0

如果您使用的是Xcode 7.1和CocoaPods 0.39,似乎有一个快速的编译器更改会影响某些CocoaPods(Nimble,Quick等)。请尝试在此线程中指定的一些解决方案:https : //github.com/ CocoaPods / CocoaPods / issues / 4420但是,如果它们都不起作用,请尝试使用Xcode 7.0.1或7.2 beta。您可以在这里获得它们:https : //developer.apple.com/downloads/

编辑:就我而言,要解决此问题,我还必须将CocoaPods降级为0.38.2。

以后的编辑:似乎与Xcode 7.1无关。只需将CocoaPods降级为0.38.2应该会有所帮助:

sudo gem uninstall cocoapods -v 0.39
sudo gem install cocoapods -v 0.38.2

谢谢@Marius Ursache。按照您的指示为我解决了这个问题。
维克·斯威夫特

0

您的头文件需要在[Build Phases / Headers / Public]部分中。

如果您的头文件已经在[Build Phases / Headers / Public]部分中,则多次执行以下操作解决了我的问题:

  1. 清理项目
  2. 将头文件移到“私有”或“项目”部分
  3. 将头文件移回“公共”部分
  4. 再次重建一切

哇,这是从这几十个答案中得出的唯一答案,这似乎是最不可能的,谢谢!
Paolo

0

我通过将module.modulemap重命名为moduleXYZ.modulemap并在项目设置中更改modulemap文件名来解决此问题



-1

从项目目录中删除这些文件。 .xcworkspace pods/podfile.lock

更新pod并构建项目。



-1

就我而言,问题是由构建阶段中的删除标头脚本引起的

function removeHeaders() {  
    find $BUILD_ROOT/...  -name '*.h' -exec rm -f {} \;  
}  
removeHeaders

删除此脚本可解决此问题。


-2

9个答案中没有一个对我有帮助,因此我尝试创建一个新项目,然后将其发送给Apple进行错误报告。令我惊讶的是我无法重现该问题。我检查了构建设置,它们是等效的。显然这是某种错误。

如果没有其他帮助,请尝试创建一个新项目,并从当前项目中至少导入一些Objective C和Swift类,将与框架相关的构建设置与新项目中的默认值进行比较,最后将所有文件移至新项目。


-2

我已经花了整整一天的时间,但是值得。我在这里尝试了所有方法但并没有解决。我创建了一个新项目,一个实验,然后发现User Header Search Path设置为$ {SRCROOT}递归,然后将其更改为$ {SRCROOT}非递归,更改了桥接标头路径(例如 #import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.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.