Was ist eine .h.gch-Datei?

116

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?

mnuzzo
quelle
13
gcc erstellt sie, wenn Sie versehentlich anweisen, eine .h-Datei zu kompilieren. Tun Sie das nicht :) (es sei denn, Sie möchten tatsächlich einen vorkompilierten Header erstellen)
Jalf
3
Außerhalb der GCC- Welt werden .gch- Dateien .pch genannt .
Patapoom

Antworten:

115

Eine .gchDatei ist ein vorkompilierter Header.

Wird a .gchnicht 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.gchwird das beschädigt oder enthält veraltete Informationen. Wenn Sie diese Datei löschen und erneut kompilieren, sollte dies behoben sein.

Dunewalker
quelle
1
Warum ist die Größe von .gch normalerweise so groß?
NAND
38

Wenn Sie etwas über eine Datei wissen möchten, geben Sie einfach am Terminal ein

file filename

file a.h.gch gibt:

GCC precompiled header (version 013) for C
Riteshkasat
quelle
2
Meins (OSX, zsh) sagt nur "Daten" für die .h.gchDatei. Ich vermute, Sie benötigen dafür die richtigen Datenbankdateien.
Ondrej Slinták
17

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

Oleksandr Timoschenko
quelle
15

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:

  1. 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

  2. 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.

tgibson
quelle
2
Für den ersten Punkt werde ich eine Funktion als Beispiel verwenden. Bevor ein Programmierer myfunc () aufrufen kann, muss der Programmierer dem Compiler myfunc () anhand eines Funktionsprototyps beschreiben. Wenn mehrere verschiedene CPP-Dateien myfunc () aufrufen, muss der Prototyp in jeder CPP-Datei angegeben werden. Es ist fehleranfällig, den Prototyp in jede CPP-Datei einzugeben. Daher wird der Funktionsprototyp in eine .h-Datei eingefügt, die # in jeder .cpp-Datei enthalten ist, in der myfunc aufgerufen wird. Header-Dateien enthalten nur Informationen für den Compiler, keinen Code, der ausgeführt wird. Es ist also sinnlos, eine .h-Datei in eine g ++ - Zeile zu setzen.
Tgibson
In Ihrer Regel 2 schließen wir CPP-Dateien ein, wenn sie eine Definition der Vorlagenfunktion haben
NAND