2016-06-23 33 views
0

Ich habe ein C++ - Projekt von Visual Studio 2015, das Verweise auf einige kostenlose Bibliotheken von Drittanbietern enthält.Teilen Sie ein Visual Studio C++ - Projekt: Wie geht es (fast) automatisch?

Nur um die Kompilierzeit zu reduzieren (derzeit 5 - 90 Sekunden),
Ich möchte das Projekt in viele kleinere Projekte aufteilen.

In Vorbereitung, ich habe bereits Filter im Lösungsexplorer erstellt. zeigen
Die Filter eine Top-Level-Struktur meines Projektes - aufgeteilt in Tier: -

Tier 1 - my core library, no reference to outside, rarely change 
Tier 2a - my custom encapsulator for external library "A" 
Tier 2b - my custom encapsulator for external library "B" 
... 
    note: all Tier2 #include Tier1 , rarely change 
Tier 3 - business logic that rarely change, #include Tier1&2 
Tier 4 - business logic that often change , #include Tier1&2&3 

Frage: Wie dieses Projekt in viele Projekte leicht zu spalten?
z.B. fast simpel, wenn man auf einen Filter klickt und dann "in ein neues Projekt extrahieren" auswählt

Ich habe einige Quellen gelesen - ihre Erklärung eignet sich für die Erstellung von Grund auf neu, nicht für ein bestehendes Projekt.

Es scheint auch, dass ich einige Zeilen für einige einzelne Dateien hinzufügen muss.

Ich habe> 100 Dateien, so ist es nicht sehr praktisch.
Ich googelte "Split Visual Studio C++ Projekt", fand aber nicht viele Ergebnisse.

Relate Frage: nicht erklären, "wie"
How do you split a Visual Studio Solution?

Externer Link: alle die Zeile #define DECLDIR __declspec (dllexport)
http://www.codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c9855/DLL-Tutorial-For-Beginners.htm
https://manski.net/2011/11/creating-a-dll-project/

+1

Es gibt keinen einfachen Weg, den ich kenne. Ich mache normalerweise eine Kopie des gesamten Projektordners, benenne die vcxproj-Datei um, benenne alle Referenzen in den Projektnamen in der vcxproj-Datei um (benutze notepad ++), füge dann das neue Projekt zur Lösung hinzu und lösche alle Dateien, die ich nicht haben wollte da drin. Dauert ungefähr 3 Minuten, sobald Sie sich daran gewöhnt haben ... nicht ideal, aber immer noch ... – Baldrick

+0

@Baldrick Thanks! 3 Minuten am besten ist sehr wenig! .... Können Sie bitte erklären, "benennen Sie alle Referenzen auf den Projektnamen in der vcxproj Datei" bitte? Wenn ich pj1.vcxproj habe und Bibliothek pj2 erstellen möchte, werde ich grob alle Wörter "pj1" in pj1.vcxproj bearbeiten müssen, richtig? Ich habe nur einen Platz gefunden pj1, meinst du das? ...... Muss ich noch DECLDIR declspec (dllexport) jede Datei manuell? – javaLover

+1

Ja, im Grunde genommen. Wie viele Referenzen es gibt, hängt wirklich davon ab, was im Projekt enthalten ist. Benennen Sie alle gefundenen Referenzen um und versuchen Sie, sie zur Lösung hinzuzufügen. Es wird nicht geladen, wenn Sie es vermasselt haben. Dies wird nicht mit dem 'DECLDIR' Teil helfen - dafür benötigen Sie wahrscheinlich ein Makro oder Skript, um Ihre Dateien zu bearbeiten und hinzuzufügen. – Baldrick

Antwort

1

hat, würde Ich mag Beachten Sie zuerst, dass wenn sich Ihre unteren Schichten selten ändern, die gesamte Kompilierung auch selten auftreten wird. Beachten Sie auch, dass es keinen einzigen Klick gibt, um alle Lösungen zu beherrschen.

Sie sind fast da. Wenn Sie Ihr Projekt bereits in eine separate Bibliothek gruppiert haben, besteht der nächste Schritt darin, sie in eine dynamische Bibliothek umzuwandeln. Dies würde die Kompilierung erheblich beschleunigen, solange kein Symbol geändert wird (die Implementierung ist in Ordnung). Zum Beispiel für Tier 1 Projekt:

Erstellen Sie zunächst ein dynamisches Bibliotheksprojekt (DLL-Projekt). Löschen Sie den gesamten Quellcode, der von VS generiert wurde. Gruppieren Sie den Quellcode (Header und cpp/Implementierungsdatei) Tier 1 in das Projektverzeichnis. Fügen Sie sie dem Projekt hinzu.

Wir können mehrere dynamische Bibliotheken für jede Header-Datei haben, aber Visual Studio ist nicht die beste IDE für eine solche Aufgabe (verwenden Sie Technologie wie CMake oder QBS). Um sicher zu sein, konsolidieren Sie Deklarationen in einzelne Header-Datei (oder zumindest einige handhabbare Zahl, vergessen Sie nicht, die #include in Implementierungsdateien zu ändern). Fügen Sie dem Header dynamische Makros hinzu, z.tier1lib.h

#ifdef DLL_EXPORT 
#define DECLDIR __declspec(dllexport) 
#else 
#define DECLDIR __declspec(dllimport) 
#endif 

Dieses Makro würde sagen, ob wir importieren oder ein Symbol auf der Grundlage unserer Build-Befehle zu exportieren.

Jetzt in tier1lib.h, markieren Sie das Symbol, das sichtbar sein wird zu anderen Projekt. In jeder Funktion hinzufügen DECLDIR Makro wie

DECLDIR void foo(); 
// or, if you want to export/import whole class' public symbols 
class DECLDIR Foo{}; 

Build it.

Teilen Sie VS im Hauptprojekt mit, wo Sie die dynamische Bibliothek finden können. Fügen Sie den Include-Pfad (wo Header zu finden sind), den Bibliothekspfad (wo Sie die Datei *.lib finden) und den Bibliotheksdateinamen (z. B. tier1lib.lib) hinzu. Kopieren Sie das Ergebnis *.dll in den Ausgabeordner des Hauptprojekts und die Kompilierung Tier 1 ist nun vollständig zum Hauptprojekt getrennt.

+0

Vielen Dank. Tier 1 hat 30. H Dateien, ich sollte nicht alle Deklarationen in einzelne Header-Datei konsolidieren, sollte ich? IMHO, nur vorwärts Deklaration von 30 Dateien kann mühsam sein und Wartbarkeit zu reduzieren. .... oder ist es "der Weg" in die reale Geschäftswelt zu gehen? – javaLover

+1

Nein. Tun Sie einfach, was Ihrem Bedarf entspricht. Die Konsolidierung von Deklarationen bedeutet einfach weniger dynamisches Bibliotheksmakro, beeinflusst nichts. –

+1

Ich würde vorschlagen, Ihre Zeit in skriptfähige Build-Tools wie "CMake" oder "QBS" zu investieren, sie haben Möglichkeiten, Build zu optimieren. Nach meiner Erfahrung (Erstellen von OpenCV) ist sogar die Verwendung von "MSBuild" wesentlich schneller als das Erstellen in VS. Sie können deutlich sehen, dass VS im Ausgabebedienfeld häufig mehr als einmal erstellt. Ich habe keine Ahnung, warum dies der Fall ist. –