2012-06-09 13 views
6

Running: gcc Version 4.2.1 (Apple Inc. bauen 5664)Langsam Compile-Zeit mit Boost-+ GCC + vorkompilierte Header

ich mit einem Standard-vorkompilierte Header einen Apfel XCode-Projekt erstellt. Es scheint sehr langsam zu sein, und eine triviale Hauptdatei mit einer Hauptfunktion, die keinen Code enthält, braucht 6 Sekunden zum Kompilieren, nachdem ich auf ein neues SSD-Laufwerk aufgerüstet habe. Ich bin auf einem Laptop, aber ich habe Bedenken, dass ein Upgrade auf eine Workstation mein Problem lindern würde. Wenn ich den vorkompilierten Header abstelle, wird die Hauptdatei in weniger als einer Sekunde kompiliert. Es scheint, dass die Verwendung eines vorkompilierten Headers eine Strafe für alle Dateien darstellt. Durch diese Verzögerung möchte ich vermeiden, dass Code kompiliert und experimentiert wird, der nicht gut ist. Hier ist, was ich in meinem vorkompilierte Header bin auch:

#pragma once 

#include <algorithm> 
#include <bitset> 
#include <complex> 
#include <deque> 
#include <fstream> 
#include <functional> 
#include <iostream> 
#include <istream> 
#include <iterator> 
#include <limits> 
#include <list> 
#include <locale> 
#include <map> 
#include <numeric> 
#include <ostream> 
#include <queue> 
#include <set> 
#include <sstream> 
#include <stack> 
#include <stdexcept> 
#include <streambuf> 
#include <string> 
#include <valarray> 
#include <vector> 

#include <boost/smart_ptr/scoped_ptr.hpp> 
#include <boost/smart_ptr/scoped_array.hpp> 
#include <boost/smart_ptr/shared_ptr.hpp> 
#include <boost/smart_ptr/shared_array.hpp> 
#include <boost/smart_ptr/make_shared.hpp> 
#include <boost/smart_ptr/weak_ptr.hpp> 
#include <boost/smart_ptr/intrusive_ptr.hpp> 

#include <boost/regex.hpp> 
#include <boost/thread.hpp> 
#include <boost/bind/bind.hpp> 
#include <boost/bind/apply.hpp> 
#include <boost/bind/protect.hpp> 
#include <boost/bind/make_adaptable.hpp> 

#include <boost/asio.hpp> 
//#include <boost/asio/ssl.hpp> 


#include <boost/property_tree/ptree.hpp> 
#include <boost/random.hpp> 
#include <boost/lexical_cast.hpp> 
#include <boost/date_time/gregorian/gregorian.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time/local_time/local_time.hpp> 
#include <boost/date_time/time_zone_base.hpp> 
#include <boost/circular_buffer.hpp> 
#include <boost/accumulators/accumulators.hpp> 
#include <boost/accumulators/statistics.hpp> 

ich nicht Geist aufgenommen haben, die wirklich die Kompilierung steigen macht.

+0

So nimmt eine "triviale Hauptdatei mit einer Hauptfunktion no enthält keinen Code" viel weniger Zeit zum Kompilieren als ein Projekt mit allen oben aufgeführten Includes? Sollte das nicht erwartet werden? – jedwards

+0

Auch mein Verständnis von vorkompilierten Headern ist, dass sie nur dazu neigen, die Kompilierzeit zu speichern, wenn sie sonst wiederholt kompiliert werden würden, und zwar über 'include's aus mehreren Quellen. Dies ist bei Ihnen nicht der Fall, daher würde ich mir vorstellen, dass Ihre Kompilierzeit bei Verwendung vorkompilierter Header ähnlich wäre wie ohne. Das heißt, Sie würden nicht viel von einem Gewinn realisieren, wenn Sie vorkompilierte Header verwenden. Sie sollten Ihre Includes wirklich auf quellendateispezifische Basis beschränken. – jedwards

+0

Und was bedeutet das: "Diese Verzögerung lässt mich vermeiden, mit Code zu kompilieren und zu experimentieren, der nicht gut ist."? – jedwards

Antwort

7

Die vorkompilierten Header von GCC funktionieren auf sehr spezielle Weise. Nur eine vorkompilierte Header-Datei kann in jeder gegebenen Quelldatei verwendet werden. Verwenden Sie -H, um anzuzeigen, ob eine angegebene Headerdatei eine vorkompilierte Version verwendet oder nicht.

Darüber hinaus müssen Sie die Header-Datei mit den gleichen Compiler-Flags wie die Quelldatei, die es verwendet, kompilieren.

Der typische Weg, um eine PCH-Umgebung einzurichten, ist wie folgt:

main.cpp:

#include "allheaders.hpp" 

int main() { /* ... */ } 

allheaders.hpp:

#include <algorithm> 
// ... everything you need 

Compilation:

g++ $CXXFLAGS allheaders.hpp     # 1 
g++ $CXXFLAGS -H -c -o main.o main.cpp  # 2 
g++ $LDFLAGS -o myprogram main.o    # 3 

Nach Schritt # 1 sollten Sie mit einer Datei allheaders.hpp.gch enden, die ziemlich groß sein sollte. In Schritt # 2 sollte das Flag -H zusätzliche Ausgabe produzieren, die Ihnen mitteilt, dass die vorkompilierte Header-Datei verwendet wird. Schritt # 3 verknüpft die ausführbare Datei.

Die Idee ist, dass Schritt # 1 möglicherweise sehr lange dauern kann, aber Schritt # 2 sollte viel schneller werden.

+1

Ich habe den GCC-Befehl analysiert und verweist auf eine 308-MB-Pseudotextdatei, die wie ein verarbeiteter vorkompilierter Header aussieht. Der vorkompilierte Header ist automatisch für jede Quelldatei enthalten, die manche nicht zu erhalten scheinen, und bringt eine Latenzzeit von ca. 6 Sekunden. Ich kann mich nicht erinnern, dieses Problem mit Visual Studio gehabt zu haben, obwohl ich es bei VS immer auf einer saubereren Workstation laufen lasse.Eine Verzögerung von 6 Sekunden, wenn ich einen Buchstaben in einer Datei ändere, ist inakzeptabel und summiert sich zu Minuten/Stunden/Tagen verschwendeter Zeit über den Entwicklungszyklus hinweg. – user805547

+0

Nun, Sie sollten sich überlegen, welche Header vorkompiliert werden sollen. Natürlich sollten Sie keinen einzigen PCH haben. Im Idealfall würden Sie für jede * Quelldatei einzeln einen Header "all headers" erstellen. Praktisch würde ich diese Behandlung für jene Dateien reservieren, die wirklich all die schweren Boost-Sachen implementieren. –

+0

Ich benutze Boost so ziemlich überall, so dass diese nicht in den PCH gebracht werden, sondern dazu führen, dass einzelne Dateien langsam kompiliert werden. Ich fange an zu denken, dass dieser Laptop und Software zu langsam für ernsthafte C++ - Entwicklung ist. Es ist in Ordnung für Cocoa, aber Boost und seine starke Verwendung von Vorlagen und Metaprogrammierung ist ein Mörder. – user805547