什么是.h.gch文件?


116

我最近有一个课堂项目,必须用G ++编写程序。

我使用了一个makefile,由于某种原因,它偶尔会留下一个.h.gch文件。

有时,这不会影响编译,但是每隔一段时间,它将导致编译器针对已解决或没有意义的问题发出错误。

我有两个问题:

1)什么是.h.gch文件,其用途是什么?和

2)为什么不清理会引起此类问题?


13
如果您不小心告诉它编译.h文件,则gcc会创建它们。请勿这样做:)(除非您实际上要创建预编译的标头)
jalf

3
GCC世界之外,.gch文件称为.pch
Patapoom

Answers:


115

.gch文件是一个预编译的头。

如果.gch找不到a,则将使用普通头文件。

但是,如果您的项目设置为生成预编译的标头,则将生成它们(如果不存在),并在下一个版本中使用它们。

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


1
那么,为什么.gch的大小通常这么大?
NAND

38

如果您想了解文件,只需在终端上输入

file filename

file a.h.gch 给出:

GCC precompiled header (version 013) for C

2
我的(OSX,zsh)只是对.h.gch文件说“数据” 。我怀疑您为此需要适当的数据库文件。
OndrejSlinták18



15

关于什么是gch文件,其他答案是完全准确的。但是,上下文(在这种情况下,是使用g ++的初学者)就是一切。在这种情况下,有两个规则:

  1. 永远不要将.h文件放在g ++编译行上。仅.cpp文件。如果.h文件曾经被意外编译,请删除所有* .gch文件

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

如果违反了规则一,则有时会出现问题中所述的问题。如果第二条规则被打破,则链接器有时会抱怨多重定义的符号。


2
对于第一点,我将以一个函数为例。在程序员可以调用myfunc()之前,程序员必须使用函数原型向编译器描述myfunc()。如果几个不同的.cpp文件调用myfunc(),则必须在每个.cpp中提供原型。在每个.cpp文件中键入原型容易出错。因此,将函数原型放置在.h文件中,该文件已#include在每个调用myfunc的.cpp文件中。头文件仅包含有关编译器的信息,而不包含执行的代码。因此,将.h文件放在g ++行上是没有意义的。
tgibson

在您的规则2,我们#包含.cpp文件,如果他们有模板函数的定义
NAND
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.