什么是Xcode中的Prefix.pch文件?

114

许多开发者在Prefix.pch中添加各种方便的宏定义。但我的问题是,这个Prefix.pch文件是什么?

  • 如果我从我的Xcode中删除Prefix.pch文件,那么我的应用程序会运行吗?还是会出现错误?或者在构建时崩溃?

  • 如何在没有Prefix.pch文件的情况下运行我的应用程序?


2
可能是从Xcode项目中删除Prefix.pch文件是否可以?的重复问题。 - dandan78
4个回答

129

预编译头文件。

是什么?

Prefix.pch 是一个预编译头文件。预编译头文件的发明旨在加快编译速度。这些文件只需提前解析一次,而不必一遍又一遍地解析相同的头文件。

Xcode

在 Xcode 中,您可以将要使用的头文件导入“前缀头文件”,并启用 Precompile Prefix Header 以进行预编译。但是,前缀头文件的概念与预编译不同。

每个源文件都会在开头隐式包含前缀头文件,就像每个源文件添加了:

#import "Prefix.pch"

在文件顶部,其他任何内容之前。

去除它。

您可以移除预编译头文件。此问题已在我下面链接的线程中得到解答。它包含了您需要的所有信息和有用的评论。

从Xcode项目中移除 Prefix.pch 文件是可以的吗?


29

什么是Prefix.pch文件?

.pch文件是预编译头文件。

在C和C++编程语言中,头文件是一个文件,其文本可以通过C预处理器自动包含在另一个源文件中,通常由源文件中的编译器指令指定。

前缀头文件被编译并存储在缓存中,然后在编译期间自动包含在每个文件中。这可以加快编译速度,并使您可以在不向使用它的每个文件添加import语句的情况下包含文件。它们不是必需的,实际上每次更改它们时会减慢编译速度。

是的,您可以在没有.pch文件的情况下编译和运行项目

在Xcode中,转到目标的构建设置(Command-Option-E, build tab),取消选中Precompile Prefix Header(GCC_PRECOMPILE_PREFIX_HEADER)。如果您愿意,也可以删除前缀标题设置的值。

还要注意的是,

不要将宏放在.pch文件中! .pch文件是项目特定的预编译头文件。它真的不应该超出项目的上下文范围,并且除了#include和#import之外,它真的不应该包含任何东西。

如果您有一些想要在头文件之间共享的宏等内容,请将它们放在自己的头文件中 - Common.h或其他名称 - 并在.pch的开头#include该文件。


很可能是因为你复制并粘贴了以下问题,但没有注明出处:https://dev59.com/VG445IYBdhLWcg3wucio - Ben Butterworth
感谢@BenButterworth查看这个旧回答,在我回答时可能错过了归属问题,但是如果您仔细查看,我已经更改并分割了问题,并从您提到的问题中复制了答案。感谢您让我知道并纠正了这个问题。然而,我不记得从哪个其他来源复制了剩余的答案部分。 - Hemang

8

前缀头文件会被编译并存储在缓存中,然后在每次编译时自动包含在每个文件中。这可以加快编译速度,并且允许您在不向每个使用它的文件添加导入语句的情况下包含一个文件。它们并不是必需的,实际上每当您更改它们时都会减慢编译速度。

通常,.pch文件的命名格式为yourProjectName-Prefix.pch


1

前缀头文件和预编译头文件(.pch)

历史:

[#include -> #import] -> 预编译头文件 .pch -> [@import Module(ObjC);] -> [import Module(Swift)]

预编译头文件 - prefix.pch

创建新的 .pch 文件

File -> New -> File... -> PCH File

PrefixHeader.pch 示例:

#ifndef PrefixHeader_pch
#define PrefixHeader_pch
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif

从Xcode 6开始,您需要手动设置.pch文件。以前它被称为<product_name>-Prefix.pchXcode:

前缀头文件(GCC_PREFIX_HEADER) - .pch 文件的路径。将 .pch 中的所有内容添加到所有源文件中。

SomeFile1.h

//You can skip this section. It will be compiled 
//#import <UIKit/UIKit.h>
//#import <Foundation/Foundation.h>

//implicitly next line is used
#import "PrefixHeader.pch"

< p > 预编译前缀头文件(GCC_PRECOMPILE_PREFIX_HEADER) - 当选择时,将使用GCC_PREFIX_HEADER中的前缀头文件一次*来生成预编译源,并将存储在缓存中以加快构建时间。

//path to cached precompiled headers
/<some_path>/DerivedData/ExperiementsModuleSwift-dsetoksxykdmgvczgtnmaqmjwhzk/Build/Intermediates.noindex/PrecompiledHeaders/SharedPrecompiledHeaders/14385052922615550324
//e.g
/Users/alex/Library/Developer/Xcode/DerivedData/ExperiementsModuleSwift-dsetoksxykdmgvczgtnmaqmjwhzk/Build/Intermediates.noindex/PrecompiledHeaders/SharedPrecompiledHeaders/14385052922615550324

#import vs .pch

这个特性可以提高编译时间(与#include/#import相比),因为它会预编译全局的prefix headers。当prefix headers的某些内容发生变化时,编译器必须重新编译它们。因此,在这里应该使用稳定(不经常更改)的prefix headers,否则您将看不到编译时间的改善。此外,您应该支持它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接