Frage

Ich habe eine Lösung mit vielen Visual C ++ Projekte, die alle PCH verwenden, aber einige haben bestimmte Compiler-Schalter eingeschaltet für projektspezifische Bedürfnisse.

Die meisten dieser Projekte teilen sich den gleichen Satz von Headern in ihren jeweiligen stdafx.h (STL, Boost, etc.). Ich frage mich, ob es möglich ist PCH zwischen den Projekten zu teilen, so dass statt jedes PCH pro-Projekt kompiliert ich vielleicht ein gemeinsames PCH haben könnte, dass die meisten Projekte in der Lösung konnten nur verwenden.

Es scheint möglich, die Lage des PCH als gemeinsamen Standort in den Projekteinstellungen angeben, so dass ich habe das Gefühl, dies funktionieren könnte. Ich gehe davon aus, dass alle Quelldateien in allen Projekten, die eine gemeinsame PCH verwenden würden die gleichen Compiler-Einstellungen haben müssen, sonst würden die Compiler über Unstimmigkeiten zwischen dem PCH beschweren und der Quelldatei kompiliert wird.

Hat jemand versucht das? Funktioniert es?

Eine verwandte Frage: sollte ein solcher PCH Scherbe übermäßig inklusive sein, oder würde das weh Gesamtzeit bauen? Zum Beispiel könnte eine gemeinsame PCH viele STL-Header enthalten, die weit verbreitet sind, aber einige projecst vielleicht nur <string> und <vector> benötigen. Würde die eingesparte Zeit durch eine gemeinsame PCH bezahlt werden verwenden, hat wieder zu einem späteren Zeitpunkt in dem Build-Prozess, wenn der Optimierer verwerfen würde all das nicht verwendete Material in das Projekt von der PCH gezogen?

War es hilfreich?

Lösung

Ja, es möglich ist, und ich kann Ihnen versichern, sind die Zeiteinsparungen signifikant. Wenn Sie Ihre PCH kompilieren, haben Sie die .pdb und .idb Dateien aus dem Projekt zu kopieren, die die PCH-Datei erstellt. In meinem Fall habe ich ein einfaches zwei Datei Projekt, das eine PCH-Datei erstellt. Der Header wird Ihre PCH-Header und die Quelle wird gesagt werden, um die PCH unter Projekteinstellungen erstellen - das ist ähnlich dem, was Sie in jedem Projekt tun normalerweise würde. Wie Sie erwähnt haben, müssen Sie für jede Konfiguration die gleichen Kompilierung Einstellungen haben sonst eine Diskrepanz entstehen und der Compiler wird sich beschweren.

die oben genannten Dateien kopieren jedes Mal eine neu erstellen oder jedes Mal, wenn der PCH neu kompiliert wird ein Schmerz sein, so werden wir es automatisieren. Zur Automatisierung Kopieren, führen Sie ein Pre-Build-Ereignis, bei dem die oben genannten Dateien in dem entsprechenden Verzeichnis kopiert. Zum Beispiel, wenn Sie Debug und Release kompilieren baut Ihre PCH, die Dateien aus Debug Ihrem PCH Projekt über Ihr abhängiges Projekt Debug kopieren. So ein Kopierbefehl würde wie folgt aussehen

  

Kopieren PchPath \ Debug * PDB-Debug \ / Y

Beachten Sie die /-Y am Ende. Nach dem ersten Build wird jeder nachfolgende Build schrittweise zusammengestellt, damit, wenn Sie die Dateien wieder, Visual Studio beschwert sich über beschädigte Symbole ersetzen. Wenn sie werden beschädigt tun, können Sie immer führen Sie eine neu erstellen, was wiederum die Dateien kopiert (dieses Mal wird es sie nicht überspringen, da sie nicht mehr existieren - die Bereinigung löscht die Dateien).

Ich hoffe, das hilft. Es dauerte einige Zeit, um dies zu tun, aber es hat sich gelohnt. Ich habe mehrere Projekte, die auf einem großen Rahmen ab, und die PCH muss nur einmal erstellt werden. Alle abhängigen Projekte nun sehr schnell zusammenstellen.

  

EDIT: Zusammen mit mehreren anderen Menschen, habe ich dies unter VS2010 getestet   und VS2012 und es scheint, richtig zu arbeiten.

Andere Tipps

Dies ist zwar eine alte Frage, die ich eine neue Antwort geben will, die in Visual Studio 2017 arbeitet und beinhalten keine Kopien. Einziger Nachteil:. Bearbeiten und weiterhin nicht mehr funktioniert

Grundsätzlich haben Sie ein neues Projekt für die vorkompilierte Header erstellen und alle anderen Projekt hängen davon ab. Hier ist, was ich getan habe:

Schritt für Schritt:

  1. ein neues Projekt withnin Ihre Lösung erstellen, die den Header enthält und eine einzeilige CPP-Datei (pch.h von hereon genannt), die pch.h. umfasst Das Projekt sollte eine statische lib erstellen. Setup das neue Projekt eine vorkompilierte Header zu erstellen. Die Ausgabedatei muss von allen Projekten zugänglich sein. für mich in Bezug auf IntDir, aber für Standardeinstellung könnte es auf $ (SolutionDir) relativ sein. Das pch Projekt muss nur haben definiert alle anderen Projekte zu haben.

     pch Projekteinstellungen

  2. Haben alle anderen Projekte auf diesem neuen Projekt ab. Andernfalls wird die Build-Reihenfolge falsch sein könnte.

     Projektreferenzen

  3. Setup alle anderen Projekte, die pch.h. verwenden Siehe, wie die Ausgabedatei Parameter sind die gleichen wie in der pch Projekt sind. Weitere Einfügeverzeichnisse müssen auch auf die pch.h Verzeichnis. Optional können Sie die pch-Datei in jeder CPP enthalten zwingen (oder Sie es manuell in der ersten Zeile jeder CPP-Datei enthalten).

     PCH include include

    1. Setup alle Projekte (einschließlich dem PCH-Projekt) mit der gleichen Compiler Symboldatei (die Linker Symboldatei ist nicht betroffen) zu verwenden. in meinem Beispiel Auch dies ist OutDir aber in Ihrer Lösung dieser variieren. Es hat die gleiche Datei auf der Festplatte verweisen. Die Debug Information Format muss bis C7 eingestellt wird (siehe Abbildung oben), sonst Visual Studio nicht in der Lage sein, Projekte parallel zu kompilieren. pDB

Ich hoffe, ich habe nichts vergessen. Für meine Lösung (130k loc, 160 Projekte) diese führen zu einer Kompilierung von ~ 2: 30mins statt ~ 3: 30 Minuten.

Es scheint, es ist nicht möglich, da jede Quelldatei gegen den gleichen PDB zu erstellenden hat, gegen die der PCH kompiliert wurde. darn es.

Samaursa Antwort für mich gearbeitet.

Ich sah auch dieses Link , die (für Reginald Antwort nahe der Unterseite sehen) funktioniert.

Dieses verwendet copy während Reginalds Anwendungen xcopy (I xcopy bevorzugen). So oder so, dank -. Dies beschleunigt meine baut deutlich

Das klingt wie ein Fall von „abnehmendem Ertrag“ zu mir. Angenommen, einschließlich der gemeinsamen Header Abfälle direkt 1 Sekunde pro CPP-Datei und jedes Ziel (DLL / EXE) hat 10 CPP-Dateien. Durch die Verwendung eines PCH pro Ziel, Sie 10 Sekunden pro Ziel speichern. Wenn Ihr gesamtes Projekt 10 Ziele hat, Sie 1,5 Minuten auf der gesamte Build sparen, was gut ist.

Aber es eine PCH für das gesamte Projekt zu reduzieren, dann werden Sie nur weitere 9 Sekunden speichern. Ist es das wert? Der zusätzliche Aufwand (die viel mehr knifflig sein kann einzurichten, ein Nicht-Standard-Konfigurationsassistenten werden nicht von VS ist) erzeugen nur ein 10. der Einsparung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top