Erstellen mehrerer vorkompilierter Header-Dateien mit GNU make

8

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:

%Vor%

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?

    
anatolyg 19.12.2010, 11:38
quelle

2 Antworten

5

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.

    
anatolyg 26.12.2010, 20:00
quelle
0

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.

  • Für g ++ benötigen Sie eine Erstellungsregel, um "precompiled_stuff.gch" aus einer Quelldatei zu erstellen, deren Name für den Compiler keine Rolle spielt (hier wäre aber "to_be_precompiled.cpp").
  • In Visual C ++ entspricht die Zeichenfolge "precompiled_stuff" dem Wert des / Yu-Flags und die geladenen vorkompilierten Daten stammen aus einer .pch-Datei mit einem nicht verwandten Namen, den Sie ebenfalls aus einer nicht verwandten Quelldatei erstellt haben (erneut "to_be_precompiled"). cpp "hier).
  • Nur beim Erstellen mit einem Compiler ohne Unterstützung für vorkompilierte Header muss eine Erstellungsregel eine tatsächliche Datei namens "precompiled_stuff" generieren, vorzugsweise im Build-Verzeichnis, das von den eigentlichen Quelldateien entfernt ist. "precompiled_stuff" ist entweder eine Kopie von "to_be_precompiled.cpp", ein fester oder symbolischer Link oder eine kleine Datei, die #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.

    
Stein 20.02.2015 16:45
quelle