Qu'est-ce qu'un fichier .h.gch?

116

J'ai récemment eu un projet de classe où je devais créer un programme avec G ++.

J'ai utilisé un makefile et pour une raison quelconque, il a parfois laissé un fichier .h.gch derrière.

Parfois, cela n'affectait pas la compilation, mais de temps en temps, le compilateur produisait une erreur pour un problème qui avait été corrigé ou qui n'avait pas de sens.

J'ai deux questions:

1) Qu'est-ce qu'un fichier .h.gch et à quoi sert-il? et

2) Pourquoi causerait-il de tels problèmes quand il n'était pas nettoyé?

mnuzzo
la source
13
gcc les crée si vous lui dites accidentellement de compiler un fichier .h. Ne faites pas ça :) (sauf si vous voulez réellement créer un en-tête précompilé)
jalf
3
En dehors du monde GCC , les fichiers .gch sont appelés .pch .
Patapoom

Réponses:

115

Un .gchfichier est un en-tête précompilé.

Si un .gchn'est pas trouvé, les fichiers d'en-tête normaux seront utilisés.

Cependant, si votre projet est configuré pour générer des en-têtes pré-compilés, il les créera s'ils n'existent pas et les utilisera dans la prochaine génération.

Parfois, le *.h.gchfichier sera corrompu ou contiendra des informations obsolètes, donc la suppression de ce fichier et sa recompilation devraient le corriger.

Dunewalker
la source
1
Alors, pourquoi la taille du .gch est-elle généralement si grande?
NAND
38

Si vous voulez connaître un fichier, tapez simplement sur le terminal

file filename

file a.h.gch donne:

GCC precompiled header (version 013) for C
riteshkasat
la source
2
Le mien (OSX, zsh) dit simplement "données" pour .h.gchfichier. Je soupçonne que vous avez besoin de fichiers de base de données appropriés pour cela.
Ondrej Slinták
17

a) Ce sont des en-têtes précompilés: http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

b) Ils contiennent des informations «mises en cache» à partir de fichiers .h et doivent être mis à jour chaque fois que vous modifiez le fichier .h respectif. Si cela ne se produit pas, vous avez de mauvaises dépendances définies dans votre projet

Oleksandr Timochenko
la source
15

D'autres réponses sont tout à fait exactes en ce qui concerne ce qu'est un fichier gch. Cependant, le contexte (dans ce cas, un débutant utilisant g ++) est tout. Dans ce contexte, il existe deux règles:

  1. Jamais, jamais, jamais mettre un fichier .h sur une ligne de compilation g ++. Seuls les fichiers .cpp. Si un fichier .h est compilé accidentellement, supprimez tous les fichiers * .gch

  2. Jamais, jamais, jamais mettre un fichier .cpp dans une instruction #include.

Si la règle 1 est enfreinte, le problème décrit dans la question se produira à un moment donné. Si la règle deux est enfreinte, à un moment donné, l'éditeur de liens se plaindra de symboles à définition multiple.

tgibson
la source
2
Pour le 1er point, j'utiliserai une fonction comme exemple. Avant qu'un programmeur puisse appeler myfunc (), le programmeur doit décrire myfunc () au compilateur en utilisant un prototype de fonction. Si plusieurs fichiers .cpp différents appellent myfunc (), alors le prototype doit être fourni dans chaque .cpp. Il est sujet aux erreurs de taper le prototype dans chaque fichier .cpp. Par conséquent, le prototype de fonction est placé dans un fichier .h qui est #inclus dans chaque fichier .cpp où myfunc est appelé. Les fichiers d'en-tête contiennent uniquement des informations pour le compilateur, pas le code qui est exécuté. Il est donc inutile de mettre un fichier .h sur une ligne g ++.
tgibson
Dans votre règle 2, nous #incluons les fichiers .cpp s'ils ont une définition de la fonction de modèle
NAND