Hat jemand Erfolg damit gehabt, vorkompilierte Header mit GCC zu arbeiten? Ich hatte kein Glück bei meinen Versuchen und ich habe nicht viele gute Beispiele für die Einrichtung gesehen. Ich habe Cygwin GCC 3.4.4 und 4.0 unter Ubuntu ausprobiert.
c++
gcc
precompiled-headers
Lee Baldwin
quelle
quelle
Antworten:
Ich habe definitiv Erfolg gehabt. Zuerst habe ich den folgenden Code verwendet:
Dies war nur eine Hallo-Welt von Boost Xpressive (Link siehe unten). Zuerst habe ich mit der
-H
Option in gcc kompiliert . Es zeigte eine enorme Liste der verwendeten Header. Dann habe ich mir die Kompilierungsflags angesehen, die meine IDE (code :: blocks) erzeugt hat, und so etwas gesehen:g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o
Also habe ich einen Befehl geschrieben, um die Xpressive.hpp-Datei mit genau denselben Flags zu kompilieren:
sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp
Ich habe den Originalcode erneut mit dem kompiliert
-H
und diese Ausgabe erhalten:Das ! bedeutet, dass der Compiler den vorkompilierten Header verwenden konnte. Ein x bedeutet, dass es nicht verwendet werden konnte. Die Verwendung der entsprechenden Compiler-Flags ist von entscheidender Bedeutung. Ich nahm den -H ab und führte einige Geschwindigkeitstests durch. Der vorkompilierte Header hatte eine Verbesserung von 14 Sekunden auf 11 Sekunden. Nicht schlecht, aber nicht großartig.
Hinweis: Hier ist der Link zum Beispiel: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples Ich konnte es nicht zum Laufen bringen Post.
Übrigens: Ich benutze das folgende g ++
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
quelle
-Winvalid-pch
, sicherzustellen, dass der vorkompilierte Header ordnungsgemäß verwendet wird? Wir bemerken eine große Verbesserung bei der Verwendung von pch für unsere Debug-Builds, daher frage ich mich, ob es ein Problem mit Ihrem Setup gibt.Lesen Sie zunächst die Dokumentation hier .
Sie kompilieren Header wie jede andere Datei, aber Sie fügen die Ausgabe in eine Datei mit dem Suffix von ein
.gch
.Wenn Sie beispielsweise stdafx.h vorkompilieren, haben Sie einen vorkompilierten Header, nach dem automatisch gesucht wird,
stdafx.h.gch
wenn Sie ihn einschließenstdafx.h
Beispiel:
stdafx.h:
a.cpp:
Dann kompilieren als:
Ihre Kompilierung funktioniert auch dann, wenn Sie stdafx.h nach Schritt 1 entfernen.
quelle
Der
-x
Bezeichner für vorkompilierte C ++ - Header ist-x c++-header
nicht-x c++
. Es folgt eine beispielhafte Verwendung von PCH.pch.h
::main.cpp
::Generieren Sie den PCH wie folgt:
Das
pch.h.gch
muss sich im selben Verzeichnis wie das befindenpch.h
, um verwendet zu werden. Stellen Sie daher sicher, dass Sie den obigen Befehl in dem Verzeichnis ausführen, in dem sich das Verzeichnispch.h
befindet.quelle
-c pch.h
nicht sein-c pch.cpp
?Ich habe es in der Vergangenheit einmal geschafft, vorkompilierte Header unter gcc zum Laufen zu bringen, und ich erinnere mich, dass ich damals auch Probleme hatte. Beachten Sie, dass gcc die Datei (header.h.gch oder ähnliches) ignoriert, wenn bestimmte Bedingungen nicht erfüllt sind. Eine Liste davon finden Sie auf der Dokumentationsseite des vorkompilierten gcc-Headers .
Im Allgemeinen ist es am sichersten, wenn Ihr Build-System die .gch-Datei als ersten Schritt mit denselben Befehlszeilenoptionen kompiliert und ausführbar ist wie der Rest Ihrer Quelle. Dies stellt sicher, dass die Datei auf dem neuesten Stand ist und keine subtilen Unterschiede bestehen.
Es ist wahrscheinlich auch eine gute Idee, es zuerst mit einem erfundenen Beispiel zum Laufen zu bringen, um die Möglichkeit auszuschließen, dass Ihre Probleme spezifisch für den Quellcode in Ihrem Projekt sind.
quelle
Rufen Sie gcc genauso auf, wie Sie es für Ihre Quelldatei aufrufen, jedoch mit einer Header-Datei.
z.B
Dadurch wird eine Datei mit dem Namen test.h.gch generiert
Jedes Mal, wenn gcc nach test.h sucht, sucht es zuerst nach test.h.gch und wenn es es findet, verwendet es es automatisch.
Weitere Informationen finden Sie unter Vorkompilierte GCC-Header
quelle
Stellen Sie sicher, dass
-include your_header.h
So habe ich die
bits/stdc++.h
Sammlung vorkompiliert und verwendet .Code
Dann habe ich die Bibliothek gefunden, indem ich meine Datei mit -H kompiliert und die Ausgabe betrachtet habe
wo ich gesehen habe
Also habe ich ein neues Verzeichnis
bits
innerhalb des aktuellen erstellt undstdc++.h
von dort kopiert .Dann rannte ich
welches erzeugt
bits/stdc++.gch
Normalerweise habe ich meinen Code über kompiliert
, aber ich musste das ändern
da es sich nur entschied,
.gch
statt.h
mit zu-include bits/stdc++.h
archivieren, war das der Schlüssel für mich. Eine andere Sache, die Sie beachten sollten, ist, dass Sie die*.h
Header-Datei mit fast den gleichen Parametern kompilieren müssen, mit denen Sie Ihre kompilieren*.cpp
. Wenn ich den vorkompilierten Header nicht aufgenommen-O3
oder-pthread
ignoriert habe*.gch
.Um zu überprüfen, ob alles korrekt ist, können Sie den Zeitunterschied messen, indem Sie das Ergebnis von vergleichen
oder laufe
Suchen Sie erneut nach Header-Pfaden und suchen Sie
!
beispielsweise vor dem Bibliothekspfadquelle