什么是.h.gch文件?

mnu*_*zzo 105 c++ g++

我最近有一个课程项目,我必须用G ++制作一个程序.我使用了一个makefile,由于某种原因,它偶尔会留下一个.h.gch文件.有时,这不会影响编译,但是每次都会导致编译器针对已修复或没有意义的问题发出错误.我有两个问题:

1)什么是.h.gch文件以及用于什么?和

2)为什么没有清理时会引起这样的问题?

谢谢您的帮助.

小智 104

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

如果.gch未找到a,则将使用正常的头文件.

但是,如果您的项目设置为生成预编译的头文件,那么如果它们不存在则会生成它们并在下一个版本中使用它们.

有时*.h.gch会损坏或包含过时的信息,因此删除该文件并再次编译它应该修复它.

  • 那么为什么 .gch 的大小通常如此之大? (4认同)

rit*_*sat 33

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

file filename
Run Code Online (Sandbox Code Playgroud)

file a.h.gch 得到:

GCC precompiled header (version 013) for C
Run Code Online (Sandbox Code Playgroud)

  • 我的(OSX,zsh)只是说“.h.gch”文件的“数据”。我怀疑你需要适当的数据库文件。 (5认同)

Goz*_*Goz 20

它是一个GCC预编译头.

维基百科有一个不错的解释,http://en.wikipedia.org/wiki/Precompiled_header


小智 15

a)它们是预编译的标题:http: //gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

b)它们包含来自.h文件的"缓存"信息,每次更改相应的.h文件时都应更新.如果没有发生 - 您的项目中设置了错误的依赖项


tgi*_*son 13

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

  1. 永远不会将.h文件放在g ++编译行上.只有.cpp文件.如果偶然编译.h文件,请删除任何*.gch文件

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

如果规则1被破坏,那么问题中描述的问题将在某个时刻发生.如果规则2被破坏,那么链接器会在某个时候抱怨多重定义的符号.

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