【问题标题】:Failed to emit precompiled header for bridging header无法发出桥接头的预编译标头
【发布时间】:2018-01-28 11:52:02
【问题描述】:

我从 GitHub 下载了一个项目,然后 pod 以下文件,其中一些是 OBJ-C 编写的,我使用了桥头。

pod ‘SnapKit’
pod ‘MJRefresh’
pod ‘Alamofire’
pod ‘Kingfisher’
pod ‘MBProgressHUD’
pod ‘pop’
pod ‘EVReflection’
pod ‘StreamingKit’
pod ‘iCarousel’
pod ‘ReflectionView’

当我用 Xcode 9.0 beta 2 运行项目时,不幸的是错误日志如下:

错误:未能发出预编译的标头 '/var/folders/kd/4gh0_kxx3jx4thjb_sssmmcw0000gn/T/EvoRadio-Bridging-Header-97bd5f.pch' 用于桥接头 '/Users/ringo/Downloads/EvoRadio-master/EvoRadio/Resources/EvoRadio-Bridging-Header.h'

我已经google了,但没有这样的问题。错误意味着它需要一个PCH文件? 这是我的 .pch 标头配置: 解决不了。

如何制作?

【问题讨论】:

标签: ios swift compiler-errors objective-c-swift-bridge


【解决方案1】:

我已经尝试了答案中提到的所有上述步骤,但对我没有任何效果,问题基本上出在项目的部署目标版本和 podfile 中。

在我的项目部署目标中是 10.0,而在我的 podfile 中是 11.0。

【讨论】:

  • 这是我的问题。很简单!然而,花了几个小时试图弄清楚为什么它不起作用。 ?‍♂️
  • 我的 pod 文件有 ios 9.0 版本。构建目标是 10.0,但问题仍然出现。将构建目标更改为 11.0 解决了问题。
  • 最后这么简单!谢谢?
【解决方案2】:

请注意,如果您的桥接头导入 Objective-C 代码,而该代码本身通过 myproject-Swift.h 导入应用程序的 Swift 模块,也会发生这种情况。解决方案是为您的 Swift 类型使用前向声明,并在 .m 文件中导入项目 Swift 模块。

@class MySwiftClass 或...

typedef NS_ENUM(NSInteger, MySwiftEnumType)

MySwiftEnumType 是最低级别的名称,即使对于类也是如此。所以 Swift 枚举 MyClass.MySwiftEnumType 变成了 MySwiftEnumType

【讨论】:

  • 我面临同样的问题。能详细点吗?
  • 假设它是同样的问题,有一个循环引用问题,就像 Obj-C Headers 一样。要修复它,在引用 swift 类的 Obj-C 头文件中,删除 #import "myproject-Swift.h" (将其移动到 .m 文件)。并为 ObjC 类定义中引用的 swift 类创建前向声明 @class MySwiftClass
  • @HariKaramSingh 就是这样!非常感谢! Xcode 应该从 stackoverflow 获取错误描述:)
  • 我在 bridge 文件中包含了 myclass.h,在 myclass.h 中有 -swift.h。从 myclass.h 导入部分中删除 -swift.h,问题就消失了。谢谢你:)
【解决方案3】:

确保您打开了正确的项目工作区,否则Podfile 可能没有编译所需的所有资源。

我在以前运行良好的项目中看到了同样的错误。

我发现我不小心打开了ProjectName.xcodeproj 文件,而不是ProjectName.xcworkspace 文件。打开xcworkspace 文件,很快,项目又开始工作了!

【讨论】:

    【解决方案4】:

    在为Encrypted Core Data 添加可可豆荚后,我也遇到了完全相同的问题(Xcode9 beta 6)。
    这是我的PodFile

    # Uncomment the next line to define a global platform for your project
    platform :ios, '9.0'
    pod 'EncryptedCoreData', :git => 'https://github.com/project-imas/encrypted-core-data.git'
    
    target 'Root' do
      # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
      use_frameworks!
    
      # Pods for Root
    
      target 'RootTests' do
        inherit! :search_paths
        # Pods for testing
      end
    
      target 'RootUITests' do
        inherit! :search_paths
        # Pods for testing
      end
    
    end
    

    解决方案:
    1 我将$(inherited) non-recursive 添加到Search Path -> Header Search Paths
    2 然后将${PODS_ROOT} recursive 添加到Search Path -> User Header Search Paths
    以上都是我项目的目标构建设置。

    请查看这些 SO 答案:
    1 Inherit Header Search Paths
    2 Inherit User Search Paths

    【讨论】:

    • 感谢您的回答,但我已经解决了,我删除了所有的 pod 并再次重新 pod。
    • @Ringo 将此作为答案并检查它是否正确,以便其他人可以从您的发现中受益。
    • @D4ttatraya:非常感谢您的回答。它救了我的命。你能详细说明一下这两行到底是做什么的吗?
    【解决方案5】:

    对我来说,这个问题是在我向现有项目添加新的构建配置和方案时发生的。

    解决方案是在新创建的方案上运行pod install。至此,项目搭建成功。

    【讨论】:

    • 就我而言,只需运行 pod installpod update 就可以了。
    【解决方案6】:

    我在编译模拟器而不是硬件设备时遇到了这个问题。有两个编译错误,例如:

    • 错误:未能为桥接头标头“Bridging-Header.h”发出预编译标头“Bridging-Header-97bd5f.pch”
    • 在 Bridging Header 中找不到 ActionSheetPicker_3_0/ActionSheetPicker.h(但已在此处声明)

    经过数小时的研究和尝试发现错误,项目中没有设置有效的架构来编译模拟器。

    Project -> Build Settings -> User-Defined -> VALID_ARCHS 添加架构x86_64 以启用模拟器编译。

    【讨论】:

    • 我发誓每隔一个月我就会来到这里,获胜者的答案是不同的。今天就是这个,谢谢。
    • 谢谢老兄,帮我节省了一些时间。
    【解决方案7】:

    您可以尝试此解决方案。我已经通过这种方式解决了同样的问题。

    产品 > 方案 > 编辑方案 > 在左侧菜单中选择“构建”> 查找隐式依赖项

    在构建选项卡下,选中“查找隐式依赖项”:

    然后进行清理并重新构建。

    【讨论】:

    • 这个选项现在总是默认选中。
    【解决方案8】:

    XCode 可以在某个目标中构建 seccessful,但另一个目标不能。
    最后发现Header Search Paths 不一样。 (路径:目标 > 构建设置 > 搜索路径 > 标题搜索路径 > 添加项目)
    我复制并粘贴了成功目标的路径。我做到了。太棒了。

    【讨论】:

    • 与 Xcode 12 有同样的情况:虽然不是搜索路径,而是 VALID_ARCHS 标志(它在 Xcode 12 中被弃用,谁知道 github.com/CocoaPods/CocoaPods/issues/10077),但这个想法仍然存在 - 继续逐行构建设置,最终你会发现一些东西:)(也许在一个过程中清理一些东西,这总是有用的:))
    【解决方案9】:

    在我的情况下,我的一个项目文件中出现了相同的编译器错误和“未知类型”等其他错误,所以我只是将它添加到有问题的文件中,它立即解决了它。

    #import <UIKit/UIKit.h>

    【讨论】:

    • 好吧,可能我们遇到的问题不一样,所以解决方法不一样。
    【解决方案10】:

    就我而言;

    在目标/构建设置下/

    Product_Name 部分不同于 $(TARGET_NAME)

    当我更改它 $(TARGET_NAME) 时,它被解决了。

    【讨论】:

      【解决方案11】:

      我的经验是 Xcode 无法找到项目中导入的 pod/frameworks 的头文件。

      我的项目经验: 更新 Xcode9.2 - 9.3,由于隐式定义现在不可用或已过时,许多 cocoapods 必须更新。
      我已将 Podfile 更改为现在包含“use_frameworks!”。在此之后并在处理其他编译问题后,我发现了您遇到的错误。我相信添加'use_frameworks!阻止了一些在 iOS 8 之前支持的 pod 无法正确编译。我为纠正此问题而采取的步骤:

      1. 我尝试使用 cocoa pod deintegrate 删除 Pods/ 目录
      2. 然后我用 Xcode 打开项目并清理构建文件夹和项目。 (删除派生数据文件夹中的内容)
      3. 然后我再次pod install,但问题仍然存在。

      4. 最终我删除了 Podfile 中的 use_frameworks 行,然后重复了步骤 1-3,项目现在能够找到丢失的头文件,并且问题再也没有出现过。

      【讨论】:

        【解决方案12】:

        就我而言,我在文件夹名称“支持文件”而不是“支持文件”中有错字。

        【讨论】:

          【解决方案13】:

          删除 Podfile.lock 并重新运行 pod install 为我解决了这个问题。

          【讨论】:

            【解决方案14】:

            有很多原因和可以做的事情,比如:

            唯一对我有用的是Xcode 9 - failed to emit precompiled header 中接受的答案。

            podfile 中的platform :ios, '11.0'应该匹配项目中的目标

            【讨论】:

              【解决方案15】:

              更新新的 Xcode 后,我也遇到了这种情况。经过几个小时的调查,我发现如果你有多个目标,你现在必须在 Xcode 10 的 pod 文件中添加更多目标。所以你的代码应该是这样的:

              platform :ios, '9.0'
              
              target 'EvoRadio' do
              
              pod ‘SnapKit’
              pod ‘MJRefresh’
              pod ‘Alamofire’
              pod ‘Kingfisher’
              pod ‘MBProgressHUD’
              pod ‘pop’
              pod ‘EVReflection’
              pod ‘StreamingKit’
              pod ‘iCarousel’
              pod ‘ReflectionView’
              
              target 'EvoRadio2ndtarget'   # add your second target
              
              end
              

              我发现在 Xcode 9 中你不需要添加,但在 Xcode 10 中你需要添加这个。希望这会有所帮助。

              【讨论】:

                【解决方案16】:

                我有同样的情况,请确保您已包含在 YourProjectName-Bridging-Header.h 中的 文件 A

                • 如果它使用了一些其他的类,那么那些其他的类也包括在那个文件A之前

                【讨论】:

                • 也许我们遇到的情况不一样。
                【解决方案17】:

                就我而言,我使用错误的方案(左上角菜单)进行构建。

                【讨论】:

                  【解决方案18】:

                  对于 Xcode 11,我遇到了“Security.framework”问题。我删除了这个依赖,然后重新添加它。最终解决了其他问题

                  【讨论】:

                    【解决方案19】:

                    我在重命名现有 Xcode 项目配置后收到此错误,我在其中导入了另一个 Xcode 项目。

                    要修复它,您还必须在导入的项目中重命名相同的配置。

                    【讨论】:

                      【解决方案20】:

                      由于我在这个问题上被困了 2 个工作日,我想为你分享我的问题,因为将来的搜索者可能会遇到我的问题

                      我在使用命令行运行时遇到了上述错误,我发现我正在编写的命令是用于运行 .xcodeproj ,但是要运行 .xcworkspace 你必须编写以下命令

                      xcodebuild -workspace PROJECTNAME.xcworkspace 清理存档 -archivePath build/PROJECTNAME -scheme SCHEMENAME

                      【讨论】:

                        【解决方案21】:

                        就我而言,一切都很好。我刚刚忘记在添加到桥接头文件的导入中添加“.h”

                        曾经

                        import 'Test'
                        

                        必填

                        import 'Test.h'
                        

                        【讨论】:

                          猜你喜欢
                          • 2019-02-27
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2022-12-12
                          • 2021-08-06
                          • 2018-11-21
                          • 2015-11-03
                          • 1970-01-01
                          相关资源
                          最近更新 更多