【问题标题】:Xcode failed to emit precompiled header?Xcode 未能发出预编译头文件?
【发布时间】:2018-09-17 21:19:04
【问题描述】:

提前感谢您给予我的帮助。

我昨天在互联网上搜索了半天,现在已经两个小时了,但我没有找到任何东西(除了这两个没有帮助的链接FMDatabase.h not found when using route-me library 和Failed to emit precompiled header for bridging header)

所以这是我的问题:我刚刚手头有一个以前的开发人员一直在做的项目,当我尝试启动它时,这里有两个错误:

未能发出预编译的标头 '/Users/me/Library/Developer/Xcode/DerivedData/Alavoc-arfzuirebtfstncdztyvgvtpcbgw/Build/Intermediates.noindex/PrecompiledHeaders/Alavoc-Bridging-Header-swift_1I75NH5N40QPS-clang_30E4RG2TSVLXF.pch' 用于桥接头 '/Users/me/Downloads/Alavoc-ios-master/Alavoc/bridge/Alavoc-Bridging-Header.h'

/Users/me/Downloads/Alavoc-ios-master/Alavoc/externalLib/customClass/customClassViewController.h:13:9: 错误:找不到“FMDB/FMDB.h”文件

还有一个像这样写的致命错误(即使我只计算了两个错误,这个错误出现在前面描述的另外两个错误的上方)

致命错误:模块文件 '/Users/me/Library/Developer/Xcode/DerivedData/ModuleCache/30E4RG2TSVLXF/Foundation-3DFYNEBRQSXST.pcm' 已过时,需要重建:签名不匹配说明: 由进口 '/Users/me/Library/Developer/Xcode/DerivedData/Alavoc-arfzuirebtfstncdztyvgvtpcbgw/Build/Intermediates.noindex/PrecompiledHeaders/Alavoc-Bridging-Header-swift_1I75NH5N40QPS-clang_30E4RG2TSVLXF.pch' /Users/me/Downloads/Alavoc-ios-master/Alavoc/bridge/Alavoc-Bridging-Header.h:13:9: 注意:在包含的文件中 /Users/me/Downloads/Alavoc-ios-master/Alavoc/bridge/Alavoc-Bridging-Header.h:13: #import "customClassViewController.h"

customClassViewController.h 第 13 行:

#import <FMDB/FMDB.h>

我猜这些错误是有关联的。你知道它可能来自哪里吗?

提前感谢你们的帮助,我真的很感激!

编辑 battlmonster(新错误):

这是两个错误(文件未找到(在 Alavoc-Bridging-Header.h FMDB.h 中未找到))并且未能发出预编译的标头:

致命错误:文件 '/Users/me/Downloads/Alavoc-ios-master/Alavoc/bridge/Alavoc-Bridging-Header.h' 自预编译头文件以来已被修改 '/Users/me/Library/Developer/Xcode/DerivedData/Alavoc-arfzuirebtfstncdztyvgvtpcbgw/Build/Intermediates.noindex/PrecompiledHeaders/Alavoc-Bridging-Header-swift_1I75NH5N40QPS-clang_30E4RG2TSVLXF.pch' 已建说明:请重建预编译头文件 '/Users/me/Library/Developer/Xcode/DerivedData/Alavoc-arfzuirebtfstncdztyvgvtpcbgw/Build/Intermediates.noindex/PrecompiledHeaders/Alavoc-Bridging-Header-swift_1I75NH5N40QPS-clang_30E4RG2TSVLXF.pch' /Users/me/Downloads/Alavoc-ios-master/Alavoc/bridge/Alavoc-Bridging-Header.h:29:9: 错误:找不到“FMDB/FMDB.h”文件

进口

    ^ 1 error generated. <unknown>:0: error: failed to emit precompiled header

'/Users/me/Library/Developer/Xcode/DerivedData/Alavoc-arfzuirebtfstncdztyvgvtpcbgw/Build/Intermediates.noindex/PrecompiledHeaders/Alavoc-Bridging-Header-swift_1I75NH5N40QPS-clang_30E4RG2TSVLXF.pch' 用于桥接头 '/Users/me/Downloads/Alavoc-ios-master/Alavoc/bridge/Alavoc-Bridging-Header.h'

【问题讨论】:

  • 如果您在第 13 行附近显示 customClassViewController.h 的代码会有所帮助,因为这是您错误说要查看的地方。
  • 非常感谢您的回答伙伴! customClasshViewController.h 第 13 行如下:“#import ”

标签: objective-c swift xcode header fmdb


【解决方案1】:

此错误与格式错误的桥接头有关。桥接头是一个特殊的头文件,它列出了所有 Objective-C 头文件以及必须从 Swift 代码访问的类。所有桥接头定义都经过预编译,可以在 Swift 中使用。在您的情况下,桥接头是“Alavoc/bridge/Alavoc-Bridging-Header.h”,它包含 customClassViewController.h 的标头(来自 Alavoc/externalLib/customClass),这表明您的开发人员希望 customClassViewController 是可访问的在 Swift 代码中。

现在关于桥接头的令人困惑的事情是它没有递归地包含所有内容,即它只是查看第一级定义,如果你在导入中导入了你想要在 Swift 中导入的东西,你必须添加它明确地连接到桥接头,否则您可能会收到警告(或有时会出现错误)。假设您在桥接头中有#import "A.h",并且在“A.h”中有#import "B.h",那么您可能还必须在桥接头中添加“B.h”。

现在在您的示例中 A = customClassViewController 和 B = FMDB,通常您需要将 FMDB 添加到桥接头,但问题是您很可能不希望通过桥接头将 FMDB 导出到 Swift,因为它不是为此而设计的(它适用于您自己的 objc 代码,而不适用于 3rd 方库)。

解决方案是从“customClassViewController.h”中删除第 13 行。这可能会修复桥接头编译,但可能会破坏 customClassViewController,因此您需要将 FMDB 包含在“customClassViewController.m”中,并且很可能将“customClassViewController.h”调整为没有与 FMDB 相关的任何内容(或前向声明那些@class X; 的用法)。

如果您将 #import &lt;FMDB/FMDB.h&gt; 移动到您的实现 (.m) 文件并仍然得到 error: 'FMDB/FMDB.h' file not found,则可能是 FMDB 路径未在您的标头搜索路径中列出。

要解决最后一个问题,只需在 Xcode 构建设置的“标题搜索路径”中包含正确的路径。假设 FMDB 位于 /Users/me/Downloads/Alavoc-ios-master/Alavoc/ASDASD/FMDB (你有 /Users/me/Downloads/Alavoc-ios-master/Alavoc/ASDASD/FMDB/FMDB.h里面),然后你需要打开 Xcode 项目设置 - 选择左侧的目标 - 选择顶部的“构建设置” - 找到“标题搜索路径”设置并添加 /Users/me/Downloads/Alavoc-ios-master/ Alavoc/ASDASD 路径

【讨论】:

  • 非常感谢您的回答,这让一切都清楚了。所以我在 customClassViewController.h 中注释了第 13 行,并在 customClassViewController.m 中添加了 import 。但是仍然有错误说文件 FMDB/FMDB.h 仍然没有找到,我不明白吗?也许正是这导致无法发出预编译的标头? (仍然有错误说未能发出预编译头)
  • 如果是同一个文件和行,也许你应该清理并重建项目。如果它是新的东西 - 找到它。
  • 我清理了项目并再次构建,仍然找不到 FMDB/FMDB.h 文件并且无法发出(我猜这与找不到 FMDB 的事实有关)。有任何想法吗? :(
  • 发布新的错误信息。如果您删除了导入行,它就不能相同(除非您需要在其他地方将其删除)。
  • 哦,不过这样就容易多了。只需在 Xcode 构建设置的“标题搜索路径”中包含正确的路径。假设 FMDB 位于 /Users/me/Downloads/Alavoc-ios-master/Alavoc/ASDASD/FMDB (你有 /Users/me/Downloads/Alavoc-ios-master/Alavoc/ASDASD/FMDB/FMDB.h里面),然后你需要打开 Xcode 项目设置 - 选择左侧的目标 - 选择顶部的“构建设置” - 找到“标题搜索路径”设置并添加 /Users/me/Downloads/Alavoc-ios-master/那里有 Alavoc/ASDASD 路径。
【解决方案2】:

如果您使用的是 cocoapod 并且它是一个框架,建议您不要将其包含在预编译的标头中。

相反,objc 文件,使用:

@import framework_name;

【讨论】:

  • 感谢您的帮助,但我现在不明白?我不应该在预编译的头文件中包含什么?
  • 我现在也没有明确的细节。我相信它应该像 battlmonstr 所说的那样。此外,PCH 的目的绝不是为了方便人们导入 .h。顾名思义,它实际上是在编译前导入文件,这与导入 .h 不同。因此,我的建议是,除非您有充分的理由必须在编译前导入它们,否则:1,使用包含所有内容的 global.h,并将其导入任何地方 2,您确实在需要时导入所需的内容.
猜你喜欢
  • 2018-07-16
  • 2018-02-27
  • 1970-01-01
  • 2015-01-05
  • 2021-08-06
  • 1970-01-01
  • 2010-11-20
  • 2019-02-27
相关资源
最近更新 更多