将Objective-C框架导入Swift项目时,在Bridging Header中获取“找不到文件”


96

我有一个Swift项目,正在尝试导入基于ObjC的框架。该框架位于项目路径下的目录中,并由项目在Xcode中引用。它还被添加到项目的“构建阶段”页面的“链接二进制文件与库”中。

但是,由于某种原因,我似乎无法在Bridging-Header文件中包括该框架。我收到以下错误:

BridgingHeader.h:5:9: error: 'Parse/Parse.h' file not found
#import <Parse/Parse.h>
        ^
<unknown>:0: error: failed to import bridging header 'BridgingHeader.h'

我检查过的事情:

  1. “安装Objective-C兼容性标题”设置为“是”。
  2. 标题搜索路径包括框架的路径。

我确定我会丢失一些东西,所以如果有人有任何线索,那将是很棒的。


3
我忘了放图书馆的路径Header Search Paths,在这种情况下,问题有所帮助:D
Aishwat Singh 2013年

Answers:


78

找到一个解决方案:

  • SWIFT_OBJC_BRIDGING_HEADER必须在“目标”级别而不是“项目”级别设置“ Objective-C桥接标题”设置(aka )。确保在项目级别删除设置值。

(在我看来,这似乎是Xcode的错误,因为我不知道为什么要修复它)。


1
这真的很奇怪,我遇到了相同的错误,结果发现我在项目级别定义了标题。即使我已经在目标级别定义了它,但为了允许添加第三方框架,我也不得不从项目级别将其删除。看起来好像是Xcode错误。
Jojodmo

2
@MarcoAlmeida,如果您有测试目标,请尝试从中删除“ Objective-C桥接标题”设置。应该会有所帮助。
Davlat Mirmanov

3
难以置信的。谢谢。
达伦(Darren)2015年

1
嘿!在这里有同样的问题:(尽管上述方法无法解决...
Mike K

1
这在Xcode 9.2中为我工作。多年后仍未解决...
Oliver Eichhorn

58

我有同样的问题。例如,我将所有导入内容从 #import "HMSegmentedControl.h"更改 #import <HMSegmentedControl/HMSegmentedControl.h>为。


7
要使用可可足类,这是必需的。在桥接标题中,切勿将吊舱作为#import“ abc.h”用户#import <abc / abc.h>导入。
NaXir

1
你是上帝!非常感谢。
Alper

在我的情况下,我将#import <ios-qr-encoder / UIImage + MDQRCode.h>转换为#import“ UIImage + MDQRCode.h”,并且有效
Mashhadi

您是国王
Itai Spector

27

我必须lib在用户标题搜索路径中添加目录:

测试目标设置-用户标题搜索路径

在我的情况下,该lib目录包含.a-library文件和一些头文件。这些都包含在桥接头文件中。但是,迅速的编译器找不到它们。仅当我添加${PROJECT_DIR}/lib到“用户标题搜索路径”时,它才构建测试目标。

(我在Mavericks 10.9.5上使用Xcode 6.2)


1
我可以通过将Pods / *添加到主要目标的标题搜索路径来解决此问题。有趣的是,在将Swift框架作为依赖项添加到目标之前,我没有遇到这个问题。Xcode 7 Beta 6
bizz84'9

这正是对我有用的。我的项目中包含一个包含库(.a)的框架。我必须在用户标题搜索路径中为该库的标题创建一个搜索路径。
克里斯·利夫达尔

还必须导入Pods / library文件夹,非常感谢!
thibaut noah

17

我们遇到了相同的错误消息,但原因完全不同。

建立:

  • 应用目标,所有Obj-C代码
  • 具有单个快速测试用例和引用应用程序代码的桥接标头的单元测试目标

当我们添加第二个快速测试用例后,进行了清洁(或在队友的机器上)后,在构建单元测试目标时看到了此错误。

通过将虚拟Obj-C类添加到单元测试目标来修复该问题。


5
谢谢。尽管完全没有道理,但这绝对有效。

之后,我能够删除虚拟的Obj-C类。我的猜测是,该解决方案的副作用是创建了特定于测试目标的桥接头,这反过来(我怀疑)会导致Xcode忽略主机应用程序的桥接头。
clozach 2015年

上面的附录:全新构建后,我在编译过程中开始遇到分段错误11。经过一番尝试和错误后,似乎必须存在虚拟.m文件,但该文件可以为空。疯狂。
clozach 2015年

在我的测试目标中添加一个虚拟objc类,为我修复了它!
neoneye 2015年

5

如果使用cocoapods,请尝试通过运行以下命令来重新安装吊舱。

pod install

这对我有所帮助,因为我最近创建了一个未编译的新配置(未找到同一文件),而其他配置(调试和发布)正在编译。pod install似乎需要添加任何新配置...
Mete

5

这以某种方式为我完成了窍门:

  • 清洁项目
  • 清理构建文件夹
  • 重新启动Xcode

一定要提供通用的答案,而不是尝试尝试的指标。
Nico

这种特殊的“尝试”技巧不需要花费太多的精力,因此在您想到其他解决方案时尝试尝试也不会受到伤害。;)
Hlung

1
可悲的是,这种特殊的尝试技巧往往是正确的答案。
罗伯特·施密德

5

与Cocoapods一起安装库CocoaImageHashing时出现此错误。问题是搜索路径错误。因此,在目标级别上,当文件夹结构为Headers / Public时,在“构建设置”->“搜索路径”->“标题搜索路径”中,这些路径对应于不存在的文件夹,例如“ $ {PODS_ROOT} / Headers / Public / CocoaImageHashing” /不存在。我添加了路径$ {PODS_ROOT} / CocoaImageHashing,错误消失了。


4

有点奇怪,但是我想您必须在测试目标的“复制捆绑资源”阶段中添加资源,以使其加载来自主应用程序目标的所有标头。在我的情况下,我添加了main.storyboard它并解决了该错误。

在此处输入图片说明


4

添加/重新命名当前配置后,这发生在我身上,这很有意义。

每个配置都利用cocoapods生成的Configurations Set,因此这些东西需要匹配。

因此,如果您添加/重命名配置,则这些配置将需要使用正确的配置集,并且可以在运行pod install时进行配置。


3

如果可以帮助任何人。

在我的情况下,我添加的obj-c文件具有一个参考文件夹(xcode中的蓝色文件夹),并且标头找不到它们。只需将文件(而不是文件夹)从finder添加到xcode即可解决。


2

我有同样的问题。对我来说,原因是我为我的App和Today Extension使用了相同的桥接头。我的今日扩展不包括解析,但是由于它是在桥接标题中定义的,因此它试图查找它。我为“今日扩展”创建了一个新的桥接头,该错误消失了。


听起来不像我遇到的同样问题。我没有今日扩展。就我而言,我正在为应用程序使用桥接头,并且Parse框架包含在应用程序依赖项中。该错误还会发生在其他框架上,而不仅仅是Parse。
Dia Kharrat 2015年

2

我的框架在工作之前就突然停止工作,而这些答案对我来说都不起作用。我在“构建阶段”>“使用库链接二进制文件”中删除了该框架,然后重新添加了它。重新开始工作。


2

我花了两个小时才找到问题,并进行了修复。我的环境如下:

可可足0.39.0

迅速2.x

XCode 7.3.1

脚步:

  1. 项目路径:project_name / project_name / your_bridging_header.h
  2. 在“构建设置”的“ Swift”部分中,Objective-C桥接标头应为:project_name / your_bridging_header.h
  3. your_bridging_header.h中,将所有声明从.h更改为#import
  4. 在正在使用的类your_3rd_party中。声明导入your_3rd_party

您的答案是正确的,只需在第三点添加@jamesthakid答案即可使其更清晰。为我工作谢谢。
NaXir

5
“将所有声明从.h更改为#import”到底是什么意思?
克里斯·古纳瓦德纳

1

我刚刚复制了一个现有方案,并向该项目添加了另一个配置。我必须在框架项目中添加一个具有相同名称的配置,以便它也可以在同一DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)文件夹中构建。否则,不会创建.framework文件,因此无法导入。


1

我今天在尝试在Swift项目中使用用Objective-C编写的pod时遇到了同样的问题,上述解决方案似乎都不起作用。

在我use_frameworks!写的podfile中。评论此行,然后pod install再次运行为我解决了此问题,错误消失了。


1

(截至2017年5月27日更新)

Xcode 8. Swift Project-导入目标C。

要知道的事情:

  1. 桥接头文件必须保存在项目的文件夹中。(即,保存的级别与保存.xcodeproj的级别不同,而是更进一步地保存到保存所有swift和target c文件的文件夹中)。它仍然可以在顶层找到文件,但是无法正确链接,并且无法将Objective C文件导入到桥接头文件中
  2. 桥接头文件可以是任何名称,只要它是.h头文件即可
  3. 确保“构建设置”>“ Swift编译器-常规”>“ Objective C桥接头”中的路径正确指向您桥接的头文件
  4. 重要说明:如果仍然“找不到”,请尝试先清空桥接头文件,并清除当前已在其中写入的所有导入。确保首先可以找到桥接头文件,然后开始将目标c导入添加到该文件。由于某种原因,即使找到了它,它也会踢回相同的“未找到”错误,但是由于某种原因,它不喜欢导入
  5. 您不应该在任何目标C文件中#import“ MyBridgingHeaderFile.h”。这也会导致“找不到文件”错误

1
所有这些点都经过检查,仍然存在相同的问题:(是否应考虑其他点?
Amjad Husseini

@AmjadHusseini尝试清除项目文件,然后清除项目的派生数据,然后重新启动xCode。那曾与我
穆罕默德·阿拉姆

0

我有类似的问题,只有一种解决方案适合我。我尝试了所有建议的方法,并且知道我将桥接头设置为正确,因为我还有其他库可以工作。

当我在没有Cocoapods的情况下将库(拖放)复制到项目中时,只有在此之后,我才可以导入标头而不会出错。

我使用了facebook / Shimmer库。


0

豆荚也有类似的问题。基本上是尝试运行我的UI测试,Xcode抱怨缺少Pod。解决方案比上面描述的要简单得多:

  1. 转到项目文件(主要不是目标)
  2. 点击“信息”标签(最左侧)
  3. 为UI测试目标设置正确的pod配置(“部署目标”下方的“配置”部分)

加工!

我在一个线程中找到它:https : //github.com/CocoaPods/CocoaPods/issues/2695

听起来有点像可可豆的虫子,但我可以看到为什么它是棘手的情况。




0

2019年八月

在我的情况下,我想在来自同一目标的Objective-C头文件中使用Swift协议,为此,我需要使用Swift协议的前向声明在Objective-C接口中引用它。对于在Objective-C头文件中使用Swift类,同样应该有效。要使用前向声明,请参阅使用前向声明在Objective-C标头包括Swift类文档中的以下示例:

// MyObjcClass.h
@class MySwiftClass; // class forward declaration
@protocol MySwiftProtocol; // protocol forward declaration

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end
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.