无法为桥接标头发出预编译的标头

问题描述 投票:24回答:14

我从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-桥接-Header.h”

我用google搜索,但没有这样的问题。错误意味着它需要一个PCH文件?这是我的.pch头配置:enter image description here它无法解决它。

怎么做?

ios swift compiler-errors objective-c-swift-bridge
14个回答
19
投票

在为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


1
投票

有很多理由和事情可以做,例如:

唯一适合我的是Xcode 9 - failed to emit precompiled header接受的答案。

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


1
投票

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

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

Scr1

scr2


0
投票

我有相同的场景,请确保您已包含在YourProjectName-Bridging-Header.h中的文件A.

  • 如果它使用其他一些类,那么那些其他类也包含在该文件A之前

0
投票

就我而言,我正在构建错误的方案(左上菜单)。


0
投票

我更新了新的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
投票

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

@class MySwiftClass或......

typedef NS_ENUM(NSInteger, MySwiftEnumType)

MySwiftEnumType即使是课程也是最低级别的名字。所以Swift enum MyClass.MySwiftEnumType变成了MySwiftEnumType


13
投票

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

我在以前工作正常的项目中看到了同样的错误。

我发现我不小心打开了ProjectName.xcodeproj文件而不是ProjectName.xcworkspace文件。打开xcworkspace文件和presto,项目再次工作!


9
投票

对我来说,当我向现有项目添加新的构建配置和方案时,会出现此问题。

解决方案是在新创建的方案上运行pod install。之后,项目成功构建。


5
投票

你可以尝试这个解决方案。我通过这种方式解决了同样的问题。

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

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

然后再打扫干净并再次构建。


2
投票

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

#import <UIKit/UIKit.h>


2
投票

对于我的情况,我在文件夹名称“Supporing FIles”而不是“Supporting Files”中输入了拼写错误。


1
投票

我的经验是,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,项目现在能够找到丢失的头文件,问题再也没有自我呈现。

1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.