【问题标题】:Getting "file not found" in Bridging Header when importing Objective-C frameworks into Swift project将 Objective-C 框架导入 Swift 项目时,在桥接头中出现“找不到文件”
【发布时间】:2015-02-14 06:11:28
【问题描述】:

我有一个 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 兼容性标头”设置为“YES”。
  2. 标头搜索路径包括框架的路径。

我确定我错过了什么,所以如果有人有任何线索,那就太好了。

【问题讨论】:

  • 我忘了把库路径放在Header Search Paths,在这种情况下问题有帮助:D

标签: swift xcode bridging-header


【解决方案1】:

找到解决办法:

  • “Objective-C 桥接头”设置(又名SWIFT_OBJC_BRIDGING_HEADER)必须设置在目标级别,而不是项目级别。请务必删除项目级别的设置值。

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

【讨论】:

  • 这真的很奇怪,我遇到了同样的错误,结果证明我在项目级别定义了标题。尽管我已经在目标级别定义了它,但我必须将其从项目级别中删除,以便添加第三方框架。它看起来像是一个 Xcode 错误。
  • @MarcoAlmeida,如果您有测试目标,请尝试从中删除“Objective-C Bridging Header”设置。它应该会有所帮助。
  • 不可靠。谢谢。
  • 你好!这里有同样的问题:(虽然用上述方法没有解决...
  • 这在 Xcode 9.2 中对我有用。这么多年还是没修好……
【解决方案2】:

我也有同样的问题。我改变了我所有的进口 例如#import "HMSegmentedControl.h"#import &lt;HMSegmentedControl/HMSegmentedControl.h&gt;

【讨论】:

  • 使用 cocoapods 这是必要的。在 Bridging header 中,永远不要将 pod 导入为 #import "abc.h" 用户 #import 点赞。
  • 你是神!非常感谢。
  • 就我而言,我将 #import 转换为 #import "UIImage+MDQRCode.h" 并且它起作用了
  • 你是国王
【解决方案3】:

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

在我的例子中,lib 目录包含 .a-library 文件和一些头文件。这些包含在桥接头文件中。但是,快速编译器找不到它们。只有当我将${PROJECT_DIR}/lib 添加到用户标题搜索路径时,它才会构建测试目标。

(我在 Mavericks 10.9.5 上使用 Xcode 6.2)

【讨论】:

  • 我可以通过将 Pods/* 添加到主要目标的标头搜索路径来解决此问题。有趣的是,在将 Swift 框架作为依赖项添加到我的目标之前,我没有遇到这个问题。 Xcode 7 测试版 6。
  • 这正是对我有用的。我的项目中包含一个包含库 (.a) 的框架。我必须在用户标题搜索路径中为库的标题创建搜索路径。
  • 还要导入 Pods/library 文件夹,非常感谢!
【解决方案4】:

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

设置:

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

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

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

【讨论】:

  • 谢谢。尽管毫无意义,但这绝对有效。
  • 之后我能够删除虚拟的 Obj-C 类。我的猜测是,这个解决方案的副作用是创建了一个特定于测试目标的桥接头,这反过来(我怀疑)会导致 Xcode 忽略主机应用程序的桥接头。
  • 上面的附录:在进行干净构建后,我在编译期间开始出现分段错误 11。经过一些试验和错误,似乎必须存在虚拟 .m 文件,但它可以为空。疯狂。
  • 向我的测试目标添加一个虚拟 objc 类,为我修复它!
【解决方案5】:

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

pod install

【讨论】:

  • 这对我很有帮助,因为我最近创建了一个未编译的新配置(未找到相同的文件问题),而其他配置(调试和发布)是。 pod install 似乎是添加任何新配置所必需的...
【解决方案6】:

使用 Cocoapods 安装库 CocoaImageHashing 时出现此错误。 问题是搜索路径错误。所以在目标级别,在 Build Settings -> Search Paths -> Header Search Paths 中,路径对应于不存在的文件夹,例如“${PODS_ROOT}/Headers/Public/CocoaImageHashing”,当文件夹结构 Headers/Public / 不存在。 我添加了路径 ${PODS_ROOT}/CocoaImageHashing 并且错误消失了。

【讨论】:

    【解决方案7】:

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

    每个配置都使用 cocoapods 生成的配置集,所以这些 事情需要匹配。

    因此,如果您添加/重命名配置,这些将需要使用正确的配置集,并且运行 pod install 会做到这一点。

    【讨论】:

      【解决方案8】:

      这有点奇怪,但我想您必须在测试目标的“复制捆绑资源”阶段添加一个资源,以使其从您的主应用程序目标加载所有标头。就我而言,我添加了 main.storyboard 并解决了错误。

      【讨论】:

        【解决方案9】:

        这以某种方式对我有用:

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

        【讨论】:

        • 一定要提供通用答案而不是尝试技巧。
        • 这种特殊的“命中与尝试”技巧需要的努力非常少,因此在您考虑其他解决方案时尝试应该不会有什么坏处。 ;)
        • 可悲的是,这种特殊的“命中与尝试”技巧往往是正确答案。
        【解决方案10】:

        如果对任何人有帮助。

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

        【讨论】:

          【解决方案11】:

          (2017 年 5 月 27 日更新)

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

          须知:

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

          【讨论】:

          • 所有这些点都被检查过,仍然有同样的问题:(还有什么需要考虑的吗?
          • @AmjadHusseini 尝试清理您的项目文件,然后清除项目的派生数据,然后重新启动 xCode。对我有用
          【解决方案12】:

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

          【讨论】:

          • 听起来和我遇到的问题不一样。我没有今天的扩展。就我而言,我正在为应用程序使用桥接头,并且 Parse 框架包含在应用程序依赖项中。其他框架也会出现该错误,而不仅仅是 Parse。
          【解决方案13】:

          我的框架以前工作过,但突然停止工作,这些答案都对我不起作用。我在 Build Phases > Link Binary With Libraries 中删除了框架,然后重新添加了它。又开始工作了。

          【讨论】:

            【解决方案14】:

            我遇到了一个问题,我花了 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 的课程中​​。声明 import your_3rd_party

            【讨论】:

            • 您的答案是正确的,只需在第三点添加@jamesthakid 答案以使其更清晰。为我工作,谢谢。
            • “将所有声明从 .h 更改为 #import”到底是什么意思?
            【解决方案15】:

            如果您使用的是 Cocoapods,请尝试:

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

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

            【讨论】:

            • 谢谢...彼得斯。
            【解决方案16】:

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

            【讨论】:

              【解决方案17】:

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

              在我写了use_frameworks! 的podfile 中。评论这一行然后运行pod installagain 为我解决了这个问题并且错误消失了。

              【讨论】:

                【解决方案18】:

                我遇到了类似的问题,只有一种解决方案适合我。我尝试了所有建议的方法,我知道我的桥接头设置得很好,因为我还有其他一些库在工作。

                当我在没有 Cocoapods 的情况下将库(拖放)复制到项目中时,只有在此之后我才能正确导入标头。

                我使用了 facebook/Shimmer 库。

                【讨论】:

                  【解决方案19】:

                  我对 pod 也有类似的问题。基本上试图运行我的 UI 测试,Xcode 抱怨缺少 pod。这个问题的解决方案比上面描述的要简单得多:

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

                  工作!

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

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

                  【讨论】:

                    【解决方案20】:

                    就我而言,我只需要退出模拟器...

                    【讨论】:

                      【解决方案21】:

                      清理项目,清理构建文件夹,重新启动 Xcode。我只是在项目 goto > 构建设置 > 搜索关键字中删除路径。 Swift Compiler - General -> Objective-C Bridging header 为我工作。

                      【讨论】:

                        【解决方案22】:

                        2019 年 8 月

                        在我的例子中,我想在来自同一目标的 Objective-C 头文件中使用 Swift 协议,为此我需要使用 Swift 协议的 前向声明 来引用它在 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
                        

                        【讨论】:

                          猜你喜欢
                          • 2016-03-06
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-08-11
                          • 2015-09-14
                          • 1970-01-01
                          • 2014-09-10
                          相关资源
                          最近更新 更多