【问题标题】:Xcode MyProjectName-Bridging-Header.h does not existXcode MyProjectName-Bridging-Header.h 不存在
【发布时间】:2014-09-29 09:16:44
【问题描述】:

我想在我的 Objective-C 项目中开始使用 Swift。所以我添加了一个 swift 类:

import Foundation
@objc class System : NSObject {
    @objc func printSome() {
        println("Print line System");
    }
}

并将其导入到 .m 文件中:

#import "MyProjectName-Swift.h"

在构建我的项目时,我收到以下错误:

Bridging header 'PathToMyProject/MyProjectName-Bridging-Header.h' does not exist

注意:在“Build Settings->Swift Compiler - Code Generation->Objective-C Briding Header”下设置为 MyProjectName-Bridging-Header.h

我应该怎么做才能解决这个问题?

非常感谢任何帮助。

编辑:桥接头文件: #if 定义(__has_include) && __has_include() # 包括 #endif

#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

#if defined(__has_include) && __has_include(<uchar.h>)
# include <uchar.h>
#elif __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
#endif
#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif

#if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted) 
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif

#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif

#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif

#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
#  define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"

#if defined(__has_feature) && __has_feature(modules)
#endif

#pragma clang diagnostic pop

【问题讨论】:

  • MyProjectName-Swift.hMyProjectName-Bridging-Header.h 工作方向相反。 MyProjectName-Swift.h 是自动提供的。但是,MyProjectName-Bridging-Header.h 是半自动提供的,即您必须确保它在那里。那么,您确定可以在项目导航器中看到MyProjectName-Bridging-Header.h 吗?如果没有,请创建一个具有该名称的文件并将其添加到您的项目中。然后再次检查 Build Settings 中的路径是否正确(它应该包括您的项目目录:MyProjectName/MyProjectName-Bridging-Header.h
  • 你检查过你的产品模块名不为空吗? (构建设置 -> 打包 -> 产品模块名称)
  • 尼娜,是的,我的模块名称是“MyProjectName”,而不是 ells
  • milos,我认为 Xcode 应该自动生成这个 briding 文件。所以不,我的项目中没有那个文件。
  • 您是否手动指定了 Bridging-Header.h?我明白了,“新娘”有一个拼写错误

标签: ios objective-c xcode swift


【解决方案1】:

如果桥接文件是在与其他类相同的级别创建的,您可能需要添加相对路径,如这些图片所示。请注意,桥接文件是在与其他类相同的级别创建的:

我在构建设置中正确输入了名称,

但编译器没有找到该文件。

因此,如果我从项目的根目录添加相对路径(即我添加./ProjectName/BridgerFileName.h),

现在它编译了,我可以在我的 Objective C 类中调用一个方法:

【讨论】:

  • 对我来说它根本无法解决。看起来 XCode 对更新后的 Objective-C 桥接头字段没有反应。
  • 我花了很长时间才找到,但终于找到了。谢谢,修复了错误:)
  • 展示得很好!是的,不要忘记在您的项目构建设置和目标构建设置中执行此操作。
【解决方案2】:

我发现手动创建桥接头文件并选择默认名称和位置后,桥接头会放在根目录下的项目目录中。

这需要以下设置值:Targets > [Your App Target] > Build Settings > Swift Compiler - Code Generation > Objective-C Bridging Header

$(SRCROOT)/$(PROJECT_NAME)/$(PROJECT_NAME)-Bridging-Header.h 

请注意,如果您的项目是一个 swift 模块(框架),那么正如 cmets 中所指出的,您可能更喜欢:

$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h

【讨论】:

  • $(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h 会更常见:)
  • 这应该是唯一的答案!
  • $(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h 到我的项目文件夹我得到了正确的路径,但附加 /$(PROJECT_NAME) 并没有把我带到所需的路径。
  • 请注意可能遇到相同问题的其他人 - 当我复制/粘贴 @gaussblurinc 评论时,字符串的“标题”部分中复制了一些奇怪的字符。从答案中复制/粘贴相同的字符串后,它工作正常。
【解决方案3】:

对于那些正在删除桥接头的人

我与这里的大多数其他答案相反。我以前一直在使用桥接头,但我不再需要它了。从我的项目中删除它后,我开始收到问题中提到的错误。我执行了以下步骤来解决我的问题。

  1. 转到 Targets > [Your App Target] > Build Settings > Swift Compiler - General > Objective-C Bridging Header 并删除路径。 (感谢@Donamite的创意。)(您可以直接在搜索框中输入“桥接”来找到它。)
  2. 删除派生日期。转到 Xcode > Preferences > Locations 并单击 Derived Data 文件夹旁边的灰色箭头。然后删除您的项目文件夹。

【讨论】:

    【解决方案4】:

    Swift 4.1

    您的项目没有bridging-Header.h 文件,但您的项目有该路径。为此,您需要删除该路径...

    转到targets文件并选择Build Settings,---->Swift Compiler - General,然后删除bridging-Header.h。按照下面的屏幕截图....

    在 Swift 编译器中删除 bridging-Header.h 文件 - 常规

    现在你得到了这样的......

    【讨论】:

    • 我在创建通知服务扩展后有这个,删除修复它。
    【解决方案5】:

    这些是创建桥接头的步骤。

    1. File->New->iOS->Header File,将桥接文件名命名为“yourProjectName-Bridging-Header.h”

    2. Build-Settings->Objective-C Bridging Header,只需将桥接头文件名命名为“ProjectName-Bridging-Header.h”

      注意:桥接头文件应位于“.xcodeproj”文件所在项目的主根文件夹中。如果不将 Bridging 头文件移动到项目的根文件夹。这样 Xcode 就可以访问 bridge 文件了。

    3. 构建项目,并在 Bridging header 中导入必要的文件。

    【讨论】:

      【解决方案6】:

      在 Swift 项目中添加 Bridge 文件。

      步骤 1. 转到文件 > 使用 Objective-C 文件添加 Cocoa(临时用途)

      第二步,然后会出现如下弹窗

      现在按下创建桥接头按钮

      完成
      您将获得捆绑包中的 BRIGDE 文件
      谢谢

      【讨论】:

        【解决方案7】:

        对我来说,在我的桥接头文件路径前使用 $(SRCROOT)/$(PROJECT_NAME)/ 很有帮助

        【讨论】:

        • 这是一个有效的答案。它不应该被标记下来。您可以使用 $(SRCROOT) 和 $(PROJECT_NAME) 作为指南来得出正确的答案,但您可能无法复制和粘贴每个解决方案。
        • 这个答案中提出的解决方案实际上已经解决了我的问题,感谢 Srinivas Padidala
        • 去吧。$(SRCROOT)/$(PROJECT_NAME)/YourProjectName-Bridging-Header.h 为我工作............粘贴 $(SRCROOT)/ $(PROJECT_NAME)/ 原样......不要添加您的项目名称来代替 $(PROJECT_NAME)
        【解决方案8】:

        对我来说,在我的 Objective-C 桥接头路径前使用 $(SRCROOT) 很有帮助。

        $(SRCROOT)/swiftLibraries/swiftLibraries-Bridging-Header.h
        

        【讨论】:

          【解决方案9】:

          按照以下步骤操作:

          1. 删除桥接头文件。 . . (也许您手动创建)并且;
          2. 在 Objective-C 项目中创建新的 Swift 文件。 . . (不导入,先创建)

          也许这两件事会帮助你解决问题。

          【讨论】:

            【解决方案10】:

            以下内容对我有用:

            1. 桥接头文件应位于“.xcodeproj”文件所在项目的主根文件夹中。移动到项目目录并将桥接头拖放到根目录(如果它位于任何其他文件夹中)。
            2. 更正标题名称中的拼写错误。
            3. 清除派生数据
            4. 目标 -> 构建设置 -> Swift 编译器:常规 -> 添加 Obj C 标头名称。
            5. 清理并再次运行。

            【讨论】:

              【解决方案11】:

              手动创建桥接头文件

              首先删除 Xcode 创建的 Bridging 头文件。并选择您的项目转到 > 构建设置 > 搜索关键字。 Swift 编译器 - 代码生成。单击 Objective-C Bridging Header ,删除该路径。现在清理你的项目。

              现在在导航栏中选择您的项目 > 窗口。选择项目并从那里删除您的派生数据。

              Now create a new file , select the Source and then select the Header File and create your Bridging header file . File name must be your projectname-Bridging-Header.h and then create it

              选择您的项目转到 > 构建设置 > 搜索关键字。 Swift 编译器 - 代码生成。点击Objective-C Bridging Header,现在在这个Objective-C Bridging Header中添加路径,如projectname-Bridging-Header.h

              现在将您的类导入到桥接头文件中,您可以轻松地编译您的代码。

              Your bridging header file looks like this when you are creating your file manually.

              【讨论】:

                【解决方案12】:

                帮助我的是手动将文件移动到错误消息中提到的路径。所以:

                1. 我删除了文件(移到垃圾箱)
                2. 将其从垃圾箱移至错误消息中的路径
                3. 后来我还得清理项目

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-08-24
                  • 2016-04-10
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-11-04
                  • 1970-01-01
                  • 2015-01-17
                  • 1970-01-01
                  相关资源
                  最近更新 更多