模块'myFramework'的标题包不包含标题'otherFramework.h'

时间:2015-10-03 14:06:51

标签: objective-c xcode swift frameworks carthage

我的Swift / iOS9框架'viewer_protocol'使用另一个外部Objective-C框架(CocoaAsyncSocket)。我正在使用Carthage构建CocoaAsyncSocket。到目前为止一切正常:在我的框架Xcode Project中使用我的框架有一个示例App没有任何问题。

现在我想在不同的Xcode项目中使用我的框架 - 尽管使用了Carthage。我只将我的Framework作为依赖项包含在内,而Carthage会自动将依赖项解析为CocoaAsyncSocket。我将这两个框架嵌入到这个新的Xcode项目中并构建我的应用程序:这里的一切正常 - 除了一个警告我无法摆脱:

/Users/hibento/Repositories/viewer_protocol/<module-includes>:1:1: 
Umbrella header for module 'viewer_protocol' does not include header 'GCDAsyncSocket.h'

这是我的框架标题:

#import <UIKit/UIKit.h>

//! Project version number for viewer_protocol.
FOUNDATION_EXPORT double viewer_protocolVersionNumber;

//! Project version string for viewer_protocol.
FOUNDATION_EXPORT const unsigned char viewer_protocolVersionString[];

// In this header, you should import all the public headers of your framework     
using statements like #import <viewer_protocol/PublicHeader.h>
#import <CocoaAsyncSocket/CocoaAsyncSocket.h>

正如您所见,导入了CocoaAsyncSocket.h。此外,在我的框架中包含了CocoaAsyncSocket.h文件:

my framework's folder

我在这里缺少什么?我在我的框架中使用了其他几个外部框架,没有任何警告 - 所有这些外部框架都是用Swift编写的 - CocoaAsyncSocket是纯Objective-C。

这是我的框架module.modulemap:

 framework module viewer_protocol {
   umbrella header "viewer_protocol.h"

   export *
   module * { export * }
 }

 module viewer_protocol.Swift {
     header "viewer_protocol-Swift.h"
 }

更新

我找到了一个解决方案:从

更改框架头中的import语句
#import <CocoaAsyncSocket/CocoaAsyncSocket.h>

#import "CocoaAsyncSocket/CocoaAsyncSocket.h"

现在Xcode找到头文件,警告消失。

12 个答案:

答案 0 :(得分:22)

我今天遇到了同样的问题

问题是

模块' HockeySDK '的标题不包含标题' BITHockeyBaseViewController.h '

  

,解决方案是

1.构建并运行项目并转到报告导航器

2.查看警告,点击展开详细信息

它将使您成为需要进行更改的文件名 正如你在下面的屏幕截图中看到的那样

enter image description here

所以我刚刚在AppDelegate.m文件中更新了我的import语句

#import "HockeySDK/HockeySDK.h"

#import <HockeySDK/HockeySDK.h>

并且问题消失了......

希望这会对某人有所帮助。谁来这里寻求解决方案。

答案 1 :(得分:21)

我最近遇到了同样的问题。显然我在目标成员资格中将头文件设置为public,但它没有在伞头中公开。通过使用project访问权限而不是public来生成头文件来解决问题。

答案 2 :(得分:14)

对我来说,解决方案如下:

1)每个Objective C框架都有1个头文件,其中包含所有:

#import ...
#import ...
#import ...

2)确保此文件导入缺少的标头。

3)再次构建项目,它应该删除警告。

答案 3 :(得分:11)

我有同样的问题。似乎与旧的构建文件有关。

标准Xcode问题修复程序对我有用:

  1. 清理项目
  2. 已删除的衍生数据
  3. 重启Xcode

答案 4 :(得分:7)

只是为了完整性,如果您的标题设置为公开:

构建阶段&gt;标题

你应该

在其他人提到的

中包含您的主标题中的导入

OR

如果不需要公开,则将该标题移至“私人”

答案 5 :(得分:7)

或者,您可能在框架的构建阶段的Public区域内公开了文件,这些文件应该实际移回Project区域。

如果您不希望这些文件位于您框架的标题内,以便他们可以公开访问,那么您可以将其恢复。

转到框架 - &gt;目标 - &gt;构建阶段并拖动以将不必要的头文件从Public移动到Project。

Screenshot

答案 6 :(得分:2)

我们最近得到了这个,这是由于DerivedData中的损坏。删除该文件夹可以解决问题。

答案 7 :(得分:0)

看一下这篇文章:

@import vs #import - iOS 7

它涵盖了新模块导入的概念。 我有自己的自定义框架,并采用新方法导入objective-c框架

旧: #import <MyFramework/MyFramework.h>

新: @import MyFramework;

它处理了警告/

答案 8 :(得分:0)

对于其他人: 就我而言,我已经将要从框架公开的标头从“项目”移到“公共”(框架目标的构建阶段)

然后Xcode给了我这个警告。

Xcode告诉我们,我们还需要在使用框架创建的公共头文件中添加#import“警告中的头名称”,以便(框架的)客户端知道该头。

所以解决方法:
1.转到框架公共头文件。(创建框架时由xcode创建的文件)。
2.添加#import“警告中的标题名称”

答案 9 :(得分:0)

就我而言(Obj-c框架):

Umbrella header for module 'opus' does not include header 'opus_multistream.h'

我需要更改:

@import opus.opus_defines;

进入

@import opus;

(对于框架,我#import "....h"#import <....h>中没有)

答案 10 :(得分:-1)

尝试修复存​​档构建错误导致我出现此错误并发布

我的解决方案非常简单,但我永远想知道。

  • 当我运行$ pod install时,它在与我的.xcodeproj文件相同的目录中为我生成了一个工作区。
  • 但是我已经创建了一个工作空间用作其父目录。
  • 所以我只是删除了我的旧工作区,并使用了pod创建的那个

enter image description here

希望这有助于某人! glhf!

答案 11 :(得分:-1)

对我而言,修复非常简单,提交所有更改并重新构建。警告消失了。