无法导入桥接头文件

30

我已经阅读了很多有关类似问题的问答,但是我还没有找到解决方案。如果有人能够提供帮助,那就太棒了。

我创建了一个Swift项目,现在想将其与一些Objective-C合并使用。当我尝试导入我的Chartboost.h文件时,出现了“无法导入桥接头文件”的错误。只要我的桥接头文件中没有任何内容,Xcode就能找到它并给我不出问题。但是一旦我添加这个:

#import <Chartboost/Chartboost.h>

我遇到了一个错误,还有其他38个错误,错误信息为“Swift编译器错误-此处不允许函数定义”。

我已经正确导入了我的框架,并且我的框架搜索路径是正确的。只有当我导入Chartboost框架时才会出现这种情况。UIKit和Foundation工作正常。

以下是我在问题出现之前所做的事情...首先,我创建了一个新的Obj-C文件,然后在Xcode给我弹出一个窗口询问是否可以配置桥接标头时,我单击了“Yes”。这创建了“FunFacts-Bridging-Header.h”文件。

然后我确保在Swift Compiler - Code Generation下Objective-C Bridging Header路径是正确的。

我甚至放了一个非常具体的路径 /Users/me/Desktop/FunFacts/FunFacts-Bridging-Header.h,但仍然显示“导入失败”。

我还将Defines Module设置为“Yes”(因为听说可能会有帮助)。而我的产品模块名称是FunFacts。

为什么当我尝试添加#import时,FunFacts-Bridging-Header.h无法导入?


仅作为附注:显然,对于真正源自需要导入的头文件内部的错误的诊断可能会被这个关于无法导入桥接头的单个错误信息默默地吸收。真正的原因变得“隐藏”。FWIW,在我的情况下,一些看起来很无害的头文件编辑遗留物会导致Objective-C错误,我只有在单独在命令行上运行$ clang -x objective-c -c HeaderWithSyntaxError.h之后才知道了这一点。 - B98
9个回答

41

我在另一篇帖子中回答了这个问题:XCode 6.1下Chartboost集成问题

解释:

似乎有些pod和libraries没有导入基本的框架,因为他们期望你的代码已经有这些框架。但是这在Swift中行不通,因为导入框架的方式已经发生了变化。你只需要在你的桥接头文件中添加所需的框架即可。

回答:

这取决于编译器抛出的错误。 如果它抱怨NSObjectNSString等等...你需要在你的桥接头文件顶部添加#import <Foundation/Foundation.h>

如果它抱怨UIViewUIButton等等...你需要在你的桥接头文件顶部添加#import <UIKit/UIKit.h>


17

我找到了两个解决方案!

1)这不是最好的方法,但我将我的Chartboost.h文件中的所有代码复制粘贴到我的Bridging-Header.h文件中,而不是导入。这个方法可行,但我知道有更好的方法,所以我继续寻找......

2)我相信正确的解决方案是我接下来做的。我的项目(而不是目标)的Framework Search Paths为空。因此,我添加了Chartboost SDK路径:/Users/me/Desktop/Apps/SDKs/Chartboost
现在它可以构建和运行了,而且我不必把所有内容都复制粘贴到桥接头文件中。只需要这些就可以了:

#import <Chartboost/Chartboost.h>
如果有人遇到类似问题,只需阅读我在问题中所做的内容,然后再根据这个答案进行操作。

@Alam_s 我有一个类似的问题 http://stackoverflow.com/questions/26322891/how-to-integrate-chartboost-ios-sdk-with-swift 但我不想“将我的Chartboost.h文件中的所有代码复制并粘贴到我的Bridging-Header.h文件中”。此外,另一种解决方案对我似乎也不起作用。我已经添加了框架搜索路径http://i.imgur.com/PTzcidI.png,http://i.imgur.com/HRwILjd.png,但它仍然无法正常工作! - mildog8
将Chartboost.framework确切所在路径添加到你的框架搜索路径中。尝试一下。 - Alan Scarpa
很遗憾,这个方法没有起作用。我还尝试将Chartboost.h文件的内容复制到我的桥接头文件中,但也没有成功! - mildog8
请查看快速解决方案 - childrenOurFuture

9

我曾经遇到过几乎相同的问题,并找到了解决方法。

我的问题是桥接头文件没有在所有目标中。

Project Bridging Header


这个问题在我的项目中出现,但不是我的 UnitTest 目标。所以我将其添加到了我的 UITest 和 UnitTest 中,然后它开始正常工作。

Testing Target



6

像你这样的问题曾让我很困扰,但我找到了解决方案。

#import <Foundation/Foundation.h>

您需要将此代码(↑)放置在您的代码之前。 这只是我的解决方案(↓)。
#import <Foundation/Foundation.h>
#import <Chartboost/Chartboost.h>

祝你好运!


这个可行 - 真不敢相信,但它确实行得通。我只是确保在任何导入 Chartboost 的地方,Foundation 都排在第一位。你会认为 Chartboost 会提到这个问题吧? - Brian Whipp

6

这是我解决问题的方法(并且可行!):

  1. 在你的项目根目录下创建 yourProjectName-Bridging-Header.h 文件。
  2. 将你想要在 Swift 项目中暴露和使用的类的 .h 文件包含在该文件中。
  3. 转到你的项目->构建设置->搜索路径,并将 "始终搜索用户路径" 键设置为 Yes。
  4. 将 "用户头文件搜索路径" 设置为你的项目根目录路径。

就这样。

显然,当第三方文件夹被复制到你的项目中时,Xcode 会忽略它们。

我的 Xcode 版本是 6.3,Swift 版本是 1.2。


4
如果您使用CocoaPods,这将节省您的时间。 1)首先,您需要检查您的Podfile文件,它应该像这样:
target 'YourProjTests' do
    inherit! :search_paths
end

target 'YourProjUITests' do
    inherit! :search_paths
end

2) 打开baseproj配置,并为测试目标设置正确的Pods-Proj.debug,参见附图:enter image description here


4
答案非常简单。
请确保您将桥接头路径添加到目标部分的SWIFT_OBJC_BRIDGING_HEADER下,而不是项目部分。

3
请提供一个解释,说明为什么这个答案可以解决提问者的问题。 - Josh Burgess
是的,关闭Xcode后问题再次出现。"最先进的技术公司",大约在2016年左右。 - Petar

2
如果您的桥接头文件中有以下这些行:
#ifndef Bridging_Header_h
#define Bridging_Header_h

#endif /* Bridging_Header_h */

只需删除它们,就可以解决Foundation和UIKit的问题。


0

一个情况是,如果 import <Chartboost+Extention/Chartboost+Extention.h>

正确的方法是 import <Chartboost_Extention/Chartboost+Extention.h>

只是因为 Pod 构建将 Chartboost+Extention 框架名称更改为 Chartboost_Extention


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接