Ich benutze gcc (läuft als g++
) und GNU make.
Ich verwende gcc, um eine Header-Datei precompiled.h
vorzukompilieren, indem ich precompiled.h.gch
; Die folgende Zeile in einem Makefile tut es:
Alles war gut, bis ich g++
mit verschiedenen Kommandozeilenparametern ausführen musste.
In diesem Fall, obwohl precompiled.h.gch
existiert, kann es nicht verwendet werden, und die Kompilierung wird viel langsamer sein.
In der GCC-Dokumentation habe ich gelesen, dass um mit dieser Situation umzugehen,
Ich muss ein Verzeichnis namens precompiled.h.gch
machen und setzen
die vorkompilierten Header-Dateien dort,
eine Datei für jeden Satz von g++
Befehlszeilenparametern.
Nun frage ich mich, wie ich mein Makefile ändern sollte, um g++
zu erstellen
die gch-Dateien auf diese Weise.
Vielleicht kann ich g++
nur ausführen, um zu testen, ob eine vorhandene Datei verwendet werden kann
im Verzeichnis precompiled.h.gch
,
Wenn nicht, generieren Sie einen neuen vorkompilierten Header mit einem eindeutigen Dateinamen.
Hat gcc Unterstützung für einen solchen Test?
Vielleicht kann ich das, was ich will, auf andere Weise implementieren?
Es scheint komisch, meine eigene Frage zu beantworten; wie auch immer, hier geht.
Um festzustellen, ob eine geeignete vorkompilierte Header-Datei existiert, füge ich meiner Header-Datei einen absichtlichen Fehler hinzu:
%Vor% Das funktioniert, denn wenn gcc einen vorkompilierten Header findet, liest es nicht die .h
-Datei und wird den Fehler nicht finden.
Um eine solche Datei zu "kompilieren", entferne ich zuerst den Fehler und lege das Ergebnis in eine temporäre Datei:
%Vor% Hier ist MORE_HACKERY nicht nur ein einfacher Dateiname, sondern enthält einen Code, um eine Datei mit einem eindeutigen Namen ( mktemp
) zu erstellen. Es wurde zur Verdeutlichung weggelassen.
Es gibt einen einfacheren Weg, als einen # Fehler in precompiled.h einzuführen: Erstellen Sie diese Datei niemals. Weder G ++ noch Visual C ++ (zumindest bis 2005) erwarten, dass die "echte" Datei vorhanden ist, wenn eine vorkompilierte Version vorhanden ist (und wenn sie die erforderlichen Kompilierungsflags erhalten).
Nehmen wir an, die Liste von # enthält, dass wir vorkompilieren möchten heißt "to_be_precompiled.cpp". Die Dateinamenerweiterung spielt keine große Rolle, aber ich möchte diese Datei nicht als .h-Datei bezeichnen, da sie anders als echte Header-Dateien verwendet werden muss und in Visual C ++ einfacher ist, wenn es sich um eine .cpp-Datei handelt . Wählen Sie dann einen anderen Namen, um im Code darauf zu verweisen, sagen wir "precompiled_stuff". Auch hier möchte ich das nicht als .h-Datei bezeichnen, da es sich überhaupt nicht um eine Datei handelt, sondern um einen Namen, der auf vorkompilierte Daten verweist.
In allen anderen Quelldateien ist die Anweisung #include "precompiled_stuff"
kein echtes Include, sondern lädt vorkompilierte Daten. Es liegt an Ihnen, die vorkompilierten Daten vorzubereiten.
#include "to_be_precompiled.cpp"
enthält. Mit anderen Worten, Sie nehmen den Standpunkt, dass jeder Compiler die Vorkompilierung unterstützt, aber es ist nur eine dumme Kopie für einige Compiler.
Tags und Links c++ gcc precompiled-headers gnu-make