63

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

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

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

这是我的框架标题:

#import <UIKit/UIKit.h>

//! Project version number for my_project.
FOUNDATION_EXPORT double my_projectVersionNumber;

//! Project version string for my_project.
FOUNDATION_EXPORT const unsigned char my_projectVersionString[];

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

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

我的框架文件夹

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

这是我的框架 module.modulemap:

 framework module my_project {
   umbrella header "my_project.h"

   export *
   module * { export * }
 }

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

更新

我找到了一个解决方案:将我的框架标题中的导入语句从

#import <CocoaAsyncSocket/CocoaAsyncSocket.h>

#import "CocoaAsyncSocket/CocoaAsyncSocket.h"

现在 Xcode 找到头文件并且警告消失了。

4

12 回答 12

41

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

于 2016-08-03T09:49:06.317 回答
27

我今天有同样的问题

模块“ HockeySDK ”的伞头不包括头“ BITHockeyBaseViewController.h

解决方案是

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

2.查看警告,点击展开详情

它将为您提供需要更改的文件名,如下面的屏幕截图所示

在此处输入图像描述

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

新的

#import "HockeySDK/HockeySDK.h"

老的

#import <HockeySDK/HockeySDK.h>

问题消失了..

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

于 2016-03-10T08:47:31.097 回答
25

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

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

  1. 清洁项目 ( Product> Clean Build Folder)
  2. 已删除派生数据
  3. 重启 Xcode
于 2016-08-21T23:58:39.663 回答
16

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

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

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

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

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

于 2016-03-23T08:40:22.327 回答
13

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

如果您不希望这些文件位于框架的总括标头中以便它们可以公开访问,您可以将其还原。

转到框架 -> 目标 -> 构建阶段并拖动以将不必要的头文件从公共移动到项目。

截屏

于 2017-08-29T22:15:10.753 回答
7

如果您的标头设置为 public in ,则仅出于完整性考虑:

构建阶段 > 标题

你应该要么

正如其他人提到的那样,在您的主标题中包含导入

或者

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

于 2016-07-15T14:47:42.577 回答
6

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

于 2017-08-23T22:38:15.820 回答
1

对于其他人:在我的情况下,我已经将我想从我的框架中公开的标题从“项目”移动到“公共”(框架目标的构建阶段)

然后 Xcode 给了我这个警告。

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

所以修复:
1.转到框架公共头文件。(在您创建框架时由xcode创建的那个)。
2. 添加#import "the-name-of-the-header-in-the-warning.h"

于 2018-10-16T12:51:43.430 回答
1

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

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

我需要改变:

@import opus.opus_defines;

进入

@import opus;

(我没有框架#import "....h"#import <....h>框架)

于 2019-07-29T06:39:30.297 回答
0

看看这个帖子:

@import 与 #import - iOS 7

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

老的: #import <MyFramework/MyFramework.h>

新的: @import MyFramework;

它处理了警告/

于 2017-12-04T22:46:14.100 回答
-1

trying to fix a archive build error led me to this error and post

my solution was real simple but took forever for me to figure out.

  • when i ran $ pod install it generated a workspace for me in the same dir as my .xcodeproj file.
  • however i had already created a workspace to use as its parent directory.
  • so then i simply deleted my old workspace and went with the one that pods created

enter image description here


hope this helps someone! glhf!

于 2016-08-29T07:36:29.647 回答
-1

对我来说,修复相当简单,提交所有更改并重新构建。警告消失了。

于 2017-01-25T08:14:42.300 回答