什么是 .h.gch 文件?

146

最近我做了一个使用G++编写程序的课堂项目。

我使用了一个makefile,但有时会出现一个.h.gch文件残留的问题。

有时候这不会影响编译,但有时它会导致编译器发出一个错误提示,而这个问题已经被修复或者根本没有意义。

我有两个问题:

1) .h.gch文件是什么,用于什么?

2) 为什么没有清理会导致这样的问题?


22
如果你不想创建一个预编译头文件,就不要让gcc编译一个.h文件。否则,gcc会在你不经意间创建它们。(除非你确实想要创建一个预编译头文件。) - jalf
6
在GCC环境之外,.gch文件被称为.pch文件。 - Patapoom
5个回答

141

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

如果找不到.gch文件,则会使用正常的头文件。

但是,如果您的项目设置为生成预编译头文件,则会在下一次构建时创建它们并使用它们。

有时*.h.gch文件可能会损坏或包含过时的信息,因此删除该文件并重新编译应该可以解决问题。


8
为什么 .gch 文件的大小通常如此之大? - NAND
1
我在我的代码中做了一些更改,但没有反映出来。后来发现原来是使用了.gch文件。 - VPraharsha

52

如果你想了解一个文件,只需在终端输入

file filename

file a.h.gch 的输出结果为:

GCC precompiled header (version 013) for C

6
我的(OSX,zsh)只显示“.h.gch”文件的“数据”。我怀疑您需要适当的数据库文件。 - Ondrej Slinták

23

其他回答关于gch文件的定义都是准确的。然而,上下文(在这种情况下,一个初学者使用g++)非常重要。在这个上下文中,有两个规则:

  1. 永远不要将.h文件放在g++编译行中,只能放.cpp文件。如果意外编译了.h文件,请移除任何*.gch文件。

  2. 永远不要在#include语句中放置.cpp文件。

如果违反规则一,那么在某些时候会出现描述问题的错误。 如果违反规则二,在某些时候链接器会抱怨有多个定义的符号。


2
对于第一个要点,我将使用一个函数作为例子。在程序员可以调用myfunc()之前,程序员必须使用函数原型向编译器描述myfunc()。如果有几个不同的.cpp文件调用了myfunc(),则必须在每个.cpp中提供原型。在每个.cpp文件中输入原型容易出错。因此,函数原型放置在.h文件中,该文件被包含在每个调用myfunc的.cpp文件中。头文件只包含编译器的信息,没有执行的代码。因此,在g++行上放置.h文件是毫无意义的。 - tgibson
在您的规则2中,如果.cpp文件具有模板函数的定义,则我们会#include它们。 - NAND
根据规则1,如何创建.gch文件? - Frank Puck
@FrankPuck,如果一个初学者正在学习C++和g++(OP的情况),他不会创建.gch文件。我的答案不适用于有理由编译头文件的成熟软件工程师。 - tgibson

22

17

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