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

时间:2014-12-16 01:23:50

标签: xcode swift

我有一个Swift项目,我试图导入基于ObjC的框架。该框架位于项目路径下的目录中,并由Xcode中的项目引用。它还被添加到" Link Binary with Libraries"在该项目的建设阶段'页。

但是,出于某种原因,我似乎无法在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. &#34;安装Objective-C兼容性标头&#34;设置为&#34;是&#34;。
  2. 标题搜索路径包括框架的路径。
  3. 我确定我错过了一些东西,所以如果有人有任何线索,那就太棒了。

21 个答案:

答案 0 :(得分:68)

找到解决方案:

  • &#34; Objective-C Bridging Header&#34;设置(aka SWIFT_OBJC_BRIDGING_HEADER)必须设置在目标级别,而不是项目级别。请务必删除项目级别的设置值。

(对我而言,它似乎是一个Xcode错误,因为我不知道它为什么会修复它。)

答案 1 :(得分:54)

我有同样的问题。我改变了所有的进口货物 例如#import "HMSegmentedControl.h"#import <HMSegmentedControl/HMSegmentedControl.h>

答案 2 :(得分:23)

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

test target settings - user header search path

在我的情况下,lib目录包含.a - 库文件和一些头文件。这些包含在桥接头文件中。但是,swift编译器无法找到它们。只有当我将${PROJECT_DIR}/lib添加到用户标题搜索路径时,它才构建了测试目标。

(我在Mavericks 10.9.5上使用Xcode 6.2)

答案 3 :(得分:17)

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

设定:

  • App目标,所有Obj-C代码
  • 单个测试目标,带有一个快速测试案例&amp;引用应用程序代码的桥接标题

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

通过向单元测试目标添加虚拟Obj-C类来修复它。

答案 4 :(得分:5)

这对我来说不知何故:

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

答案 5 :(得分:4)

这有点奇怪,但我想你必须在测试目标的“Copy Bundle Resources”阶段添加一个资源,以便从主应用程序目标中加载所有头文件。在我的情况下,我添加了main.storyboard,它处理了错误。

enter image description here

答案 6 :(得分:3)

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

pod install

答案 7 :(得分:3)

如果帮助任何人。

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

答案 8 :(得分:2)

我有一个问题并在花了2个小时才找到它。我的环境如下:

cocoapod 0.39.0

swift 2.x

XCode 7.3.1

步骤:

  1. 项目路径: project_name / project_name / your_bridging_header.h
  2. 在Build Setting的Swift部分,Objective-C Bridging Header应为: project_name / your_bridging_header.h
  3. your_bridging_header.h 中,将所有声明从 .h 更改为 #import
  4. 正在使用的课程 your_3rd_party 。声明导入your_3rd_party

答案 9 :(得分:2)

我遇到了同样的问题。对我来说,原因是我在我的应用程序和今天的扩展程序中使用相同的桥接标题。 My Today Extension不包括Parse,但因为它是在桥接头中定义的,所以它试图寻找它。我为今天的扩展创建了一个新的桥接标题,错误消失了。

答案 10 :(得分:1)

我的框架之前正在工作,突然停止工作,这些答案都没有对我有用。我在Build Phases中删除了框架&gt; Link Binary With Libraries,并重新添加它。再次开始工作。

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

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

答案 13 :(得分:1)

(2017年5月27日更新)

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

要了解的事情:

  1. 桥接头文件必须保存在项目的文件夹中。 (即没有保存在.xcodeproj保存的同一级别,而是保存在保存所有swift和Objective c文件的文件夹中的一级)。它仍然可以在顶层找到该文件,但它无法正确链接并能够将Objective C文件导入到桥接头文件中
  2. 桥接头文件可以命名为任何内容,只要它是.h头文件
  3. 确保Build Settings&gt;中的路径Swift编译器 - 一般&gt; Objective C Bridging Header正确指向您所做的桥接头文件
  4. 重要提示:如果您仍然“未找到”,请先尝试清空桥接头文件并清除当前在那里写入的所有导入内容。确保首先找到桥接头文件,然后开始将目标c导入添加到该文件。出于某种原因,即使找到它也会发回相同的“未找到”错误但是由于某些原因它不喜欢导入你的尝试
  5. 您不应在任何目标C文件中#import“MyBridgingHeaderFile.h”。这也会导致“找不到文件”错误

答案 14 :(得分:1)

如果您使用 Cocoapods,请尝试:

  1. 退出 Xcode
  2. pod deintegrate
  3. pod install

对我来说,这解决了奇怪的问题。

答案 15 :(得分:0)

我有类似的问题,只有一个解决方案适合我。我尝试了所有建议,我知道我设置我的桥接标题很好,因为我有一些其他的lib工作。

当我将库(拖放)复制到项目中时,没有Cocoapods,只有在那之后我才能导入标题而没有错误。

我使用了facebook / Shimmer库。

答案 16 :(得分:0)

我的pod有类似的问题。基本上试图运行我的UI测试,Xcode抱怨丢失的pods。对此的解决方案比上述任何解决方案简单得多:

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

    我在一个帖子中找到了它:https://github.com/CocoaPods/CocoaPods/issues/2695

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

答案 17 :(得分:0)

在我的情况下,我只是不得不退出模拟器...

答案 18 :(得分:0)

清理项目,清理生成文件夹,重新启动Xcode。我只是在项目goto>构建设置>搜索关键字中删除路径。 Swift编译器-常规-> Objective-C桥接头为我工作。

答案 19 :(得分:0)

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

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

因此,如果您添加/重命名配置,则这些将需要使用正确的配置集,而对于运行file1 3的配置集来说,即可。

答案 20 :(得分:0)

2019年8月

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

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

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