最近我做了一个使用G++编写程序的课堂项目。
我使用了一个makefile,但有时会出现一个.h.gch文件残留的问题。
有时候这不会影响编译,但有时它会导致编译器发出一个错误提示,而这个问题已经被修复或者根本没有意义。
我有两个问题:
1) .h.gch文件是什么,用于什么?
2) 为什么没有清理会导致这样的问题?
最近我做了一个使用G++编写程序的课堂项目。
我使用了一个makefile,但有时会出现一个.h.gch文件残留的问题。
有时候这不会影响编译,但有时它会导致编译器发出一个错误提示,而这个问题已经被修复或者根本没有意义。
我有两个问题:
1) .h.gch文件是什么,用于什么?
2) 为什么没有清理会导致这样的问题?
.gch
文件是预编译头文件。
如果找不到.gch
文件,则会使用正常的头文件。
但是,如果您的项目设置为生成预编译头文件,则会在下一次构建时创建它们并使用它们。
有时*.h.gch
文件可能会损坏或包含过时的信息,因此删除该文件并重新编译应该可以解决问题。
如果你想了解一个文件,只需在终端输入
file filename
file a.h.gch
的输出结果为:
GCC precompiled header (version 013) for C
其他回答关于gch文件的定义都是准确的。然而,上下文(在这种情况下,一个初学者使用g++)非常重要。在这个上下文中,有两个规则:
永远不要将.h文件放在g++编译行中,只能放.cpp文件。如果意外编译了.h文件,请移除任何*.gch文件。
永远不要在#include语句中放置.cpp文件。
如果违反规则一,那么在某些时候会出现描述问题的错误。 如果违反规则二,在某些时候链接器会抱怨有多个定义的符号。
a) 这些是预编译头文件:http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html
b) 它们包含来自 .h 文件的“缓存”信息,应在更改相应的 .h 文件时更新。如果没有更新,说明您在项目中设置了错误的依赖关系。