Swift 框架:Umbrella header '[...].h' 未找到

Swift Framework: Umbrella header '[...].h' not found

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

当为框架目标启用 Always Search User Paths 设置时,就会发生这种情况。

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

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

在 Xcode 7 Beta 中,使用 Swift 2,如果您的框架 Header 未声明为 "Public"

,也会发生这种情况

例如,我有一个 Cocoa Touch Framework,header 文件的可见性为 "Project",所有 Swift 的错误为 "Umbrella Header ... not found"我的项目中的文件,一旦我有了 header "Public",错误就消失了

对我来说,将 'Use Header Maps' 设置为 'NO' 解决了问题

如果您使用的是 Xcode 7.1 和 CocoaPods 0.39,似乎有一个 swift 影响某些 CocoaPods(Nimble、Quick 等)的编译器更改。请尝试指定的一些解决方案在此线程中:https://github.com/CocoaPods/CocoaPods/issues/4420 however, if neither of them work, try using Xcode 7.0.1 or 7.2 beta. You can get both of them here: 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

这通常发生在项目重命名或类似的事情之后。问题是伞头不再列为 Public 头。查看附加图片以了解如何解决此问题。

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

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

  1. 清理项目
  2. 将头文件移动到 "private" 或 "project" 部分
  3. 将头文件移回 "public" 部分
  4. 再次重建一切

对我来说 - 访问级别是 public 但它也因未找到伞而失败。我确实将 "Build phases" 的 "Headers" 部分移到了顶部,它开始工作了。 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

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

9 个答案中的

None 帮助了我,所以我尝试创建一个新项目,我可以将其发送给 Apple 以提交错误。我很惊讶我无法重现这个问题。我检查了构建设置,它们是等效的。显然这是某种错误。

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

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

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

所以为了避免这个错误 - as of XCode 7 - 如下;

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

必须采取两个重要步骤。

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

的 header

其次,在 MyTarget 的构建阶段 - 如该答案中所述 - header 文件必须列在 public 部分 如上所述。

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

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

有 4 种不同的方式可以发生这种情况,忽略以前版本 Xcode

中的错误
  • 您的项目中没有名为 $(TARGET_NAME).h 的保护伞header
  • 您有一把雨伞header,但未设置为public。 See arturgrigor's answer
  • DEFINES_MODULE 未设置为 YES
  • CLANG_ENABLE_MODULES 未设置为 YES

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

我已经研究了一整天了,但是值得 it.I 尝试了所有方法 但我没有解决它。我创建了一个新项目,一个实验,我发现 User Header Search Path 设置为 ${SRCROOT} recursive,我将其更改为${SRCROOT} 非递归,更改了桥接头路径(例如#import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h"),错误消失了。

我遇到了同样的问题,none 的建议答案对我的情况有所帮助,所以我把它留在这里以防有人遇到同样的问题。

我在 "Build phases" 中添加了一个 "Run script" 但最终删除了它,那是我开始收到错误的时候。

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

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

更新 pod 并构建项目。

我发现使用新的 Swift 构建系统和并行化构建打开方案时,我会遇到类似这个问题的错误。解决方案是 link 到 swift 源文件中导入的框架。 (我认为之前该应用程序会构建,因为恰好框架 linked 到之前在串行构建队列中构建的东西)。

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

https://github.com/Jon889/SwiftImportChecker

在我的案例中,问题是由构建阶段

中删除headers脚本引起的
function removeHeaders() {  
    find $BUILD_ROOT/...  -name '*.h' -exec rm -f {} \;  
}  
removeHeaders

删除此脚本解决了问题。

我通过将有问题的框架构建设置的编译模式设置为增量来修复它。

我通过将 module.modulemap 重命名为 moduleXYZ.modulemap 并在项目设置中更改模块映射文件名解决了这个问题

根据我的经验,您必须在目标上选择给您错误的框架,而不是项目目标。
然后编译,编译后就可以在项目target上使用了。

就我而言,我只是用它的方案构建了特定的框架。然后重建整个项目,问题就解决了

确保构建设置中的“导入路径”包含您尝试包含的文件...

None 以上修复成功,但在对 cocoapods 进行大量调查后,我发现此问题是由 git 配置引起的,其中未在 git 文件系统。需要这些符号链接让 Xcode 知道框架的 headers 在哪里。

修复:

git config --global core.symlinks true

并重置 git git reset --hard HEAD

的文件系统

然后做一个干净的构建。

就我而言,问题似乎出在 Xcode 13.3 (13E113) 安装不完整。

这是导致我出现此问题的错误:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator15.4.sdk/System/Library/Frameworks/Accessibility.framework/Modules/module.modulemap:2:19: umbrella header 'Accessibility.h' not found

事实证明,SDK 中(Xcode 应用程序包中)确实缺少头文件。查看那个 Accessibility.framework 包的 Headers 目录。

这是应该的:

$ ls -l
total 80
-rw-r--r--  7 andrew  staff  12307 Feb 23 06:14 AXAudiograph.h
-rw-r--r--  1 andrew  staff   2013 Feb 23 06:57 AXBrailleMap.h
-rw-r--r--  1 andrew  staff    402 Feb 23 06:57 AXColorUtilities.h
-rw-r--r--  1 andrew  staff   2612 Feb 23 06:57 AXCustomContent.h
-rw-r--r--  1 andrew  staff    395 Feb 17 01:04 AXFoundation.h
-rw-r--r--  1 andrew  staff   2109 Feb 23 06:57 AXHearingUtilities.h
-rw-r--r--  1 andrew  staff    349 Feb 17 01:04 Accessibility.h

但是在这个 Mac 上,那个目录是空的:

$ ls -l
total 0

我们还不确定这是怎么发生的。但是 Xcode 的这个特定实例安装在 CI 中,并且 Xcode 的安装是自动的。