J'ai récemment eu un projet de classe où je devais faire un programme avec G ++. J'ai utilisé un fichier makefile et, pour une raison quelconque, il laissait parfois un fichier .h.gch derrière. Parfois, cela n’affectait pas la compilation, mais il arrivait que le compilateur génère une erreur pour un problème qui avait été corrigé ou qui n’avait aucun sens. J'ai deux questions:
1) Qu'est-ce qu'un fichier .h.gch et à quoi sert-il? et
2) Pourquoi cela causerait-il de tels problèmes quand il n'a pas été nettoyé?
Merci pour l'aide.
UNE .gch
fichier est un en-tête précompilé.
Si un .gch
n'est pas trouvé, les fichiers d'en-tête normaux seront utilisés.
Toutefois, 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 construction.
Parfois le *.h.gch
sera corrompu ou contiendra des informations obsolètes. Il est donc préférable de supprimer ce fichier et de le recompiler.
Si vous voulez en savoir plus sur un fichier, tapez simplement sur le terminal
file filename
file a.h.gch
donne:
GCC precompiled header (version 013) for C
C'est un en-tête précompilé GCC.
Wikipedia a une explication à peu près décente, http://en.wikipedia.org/wiki/Precompiled_header
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" provenant de fichiers .h et doivent être mis à jour chaque fois que vous modifiez le fichier .h correspondant. Si cela ne se produit pas, des dépendances erronées sont définies dans votre projet.
Les autres réponses sont tout à fait exactes en ce qui concerne le fichier gch. Cependant, le contexte (dans ce cas, un débutant utilisant g ++) est tout. Dans ce contexte, il y a deux règles:
Jamais, jamais, jamais mis un fichier .h sur une ligne de compilation g ++. Seuls les fichiers .cpp. Si un fichier .h est déjà compilé accidentellement, supprimez tous les fichiers * .gch.
Jamais, jamais, jamais mis 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, l'éditeur de liens se plaindra à un moment donné de symboles à définitions multiples.