Ich hatte kürzlich ein Klassenprojekt, in dem ich ein Programm mit G ++ erstellen musste.
Ich habe ein Makefile verwendet und aus irgendeinem Grund hat es gelegentlich eine .h.gch-Datei zurückgelassen.
Manchmal hatte dies keine Auswirkungen auf die Kompilierung, aber von Zeit zu Zeit gab der Compiler einen Fehler für ein Problem aus, das behoben wurde oder keinen Sinn ergab.
Ich habe zwei Fragen:
1) Was ist eine .h.gch-Datei und wofür wird sie verwendet? und
2) Warum sollte es solche Probleme verursachen, wenn es nicht aufgeräumt wurde?
Antworten:
Eine
.gch
Datei ist ein vorkompilierter Header.Wird a
.gch
nicht gefunden, werden die normalen Header-Dateien verwendet.Wenn Ihr Projekt jedoch so eingestellt ist, dass vorkompilierte Header generiert werden, werden diese erstellt, wenn sie nicht vorhanden sind, und im nächsten Build verwendet.
Manchmal
*.h.gch
wird das beschädigt oder enthält veraltete Informationen. Wenn Sie diese Datei löschen und erneut kompilieren, sollte dies behoben sein.quelle
Wenn Sie etwas über eine Datei wissen möchten, geben Sie einfach am Terminal ein
file a.h.gch
gibt:quelle
.h.gch
Datei. Ich vermute, Sie benötigen dafür die richtigen Datenbankdateien.Es ist ein vorkompilierter GCC-Header.
Wikipedia hat eine halbwegs anständige Erklärung: http://en.wikipedia.org/wiki/Precompiled_header
quelle
a) Sie sind vorkompilierte Header: http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html
b) Sie enthalten "zwischengespeicherte" Informationen aus .h-Dateien und sollten jedes Mal aktualisiert werden, wenn Sie die jeweilige .h-Datei ändern. Wenn dies nicht der Fall ist, sind in Ihrem Projekt falsche Abhängigkeiten festgelegt
quelle
Andere Antworten sind in Bezug auf eine gch-Datei völlig korrekt. Der Kontext (in diesem Fall ein Anfänger mit g ++) ist jedoch alles. In diesem Zusammenhang gibt es zwei Regeln:
Fügen Sie niemals eine .h-Datei in eine g ++ - Kompilierungszeile ein. Nur CPP-Dateien. Wenn eine .h-Datei jemals versehentlich kompiliert wurde, entfernen Sie alle * .gch-Dateien
Fügen Sie niemals eine CPP-Datei in eine # include-Anweisung ein.
Wenn Regel 1 verletzt wird, tritt irgendwann das in der Frage beschriebene Problem auf. Wenn Regel zwei verletzt wird, beschwert sich der Linker irgendwann über mehrfach definierte Symbole.
quelle