VC2010 C ++ - Organisieren von Quelldateien

68

Ich hatte einige Fragen zum Organisieren von Quelldateien in einem VC 2010 C ++ - Projekt. Die Standardfilter, die enthalten sind, werden nicht ausreichen, da ich letztendlich viele .cpp- und .hpp-Dateien haben werde, damit es nicht chaotisch wird. Ich möchte einen Ordner im Stammverzeichnis des Projekts mit dem Namen "source" erstellen und dann Ordner in "source" für die verschiedenen Quelldateikategorien erstellen, die ich verwenden möchte. Wenn ich mit der rechten Maustaste auf die Lösung klicke, kann ich nur einen Filter hinzufügen, keinen Ordner. Ich kann Ordner manuell im Windows Explorer erstellen und dann einschließen, aber dann kann ich keine Filter mehr hinzufügen. Gibt es eine Möglichkeit, neue Ordner hinzuzufügen (ohne Windows Explorer zu verwenden) und trotzdem Filter zu verwenden?

Gibt es außerdem etwas Ähnliches wie $ (CURDIR), mit dem ich den Quelldateiordner einschließen könnte, ohne einen absoluten Pfad zu benötigen?

Vielen Dank im Voraus für die Hilfe

Megatron
quelle

Antworten:

156

Sie sind ein wenig verwirrt darüber, wie Visual Studio mit C ++ - Dateien funktioniert, aber das ist in Ordnung, da die Dokumentation mies ist. Das Wichtigste zuerst: Im Gegensatz zu C # oder Java hat die Anordnung der Dateien im Projekt keinen Bezug zur Anordnung der Dateien auf Ihrer Festplatte. Dateien und Ordner sind eigentlich nicht "im" Projekt; Das Projekt listet nur die Namen und Pfade der Dateien und Ordner auf, die bereits auf Ihrer Festplatte vorhanden sein müssen.

Im Allgemeinen erstellen Sie das Layout von Ordnern mit Quelldateien in diesen Ordnern. Sie tun dies außerhalb von Visual Studio. Sie erstellen auch eine Projektdatei. Wenn Sie dem Projekt eine Datei hinzufügen, teilen Sie dem Projekt lediglich mit, wo sich die Datei auf der Festplatte befindet.

Lassen Sie uns mit einem bestimmten Beispiel arbeiten und ich zeige Ihnen, wie ich es organisieren würde. Angenommen, Sie erstellen ein Grafikrechnerprogramm namens SuperCalc . Sie haben einen Quellordner und erstellen dann Ordner innerhalb von Source, um die verschiedenen Dateien zu speichern. Angenommen, die von Ihnen erstellten Ordner sind:

  • SuperCalc\Source\Input
  • SuperCalc\Source\Math
  • SuperCalc\Source\Math\Matrix
  • SuperCalc\Source\Output

Sie haben 3 Verzeichnisse von Source: Input, Output, und Math. Das MathUnterverzeichnis hat ein Unterverzeichnis namens Matrix. Sie haben CPP-Dateien in Eingabe, Mathematik, Matrix und Ausgabe. Sie erstellen diese Verzeichnisse (Ordner) mit dem Windows Explorer oder der Eingabeaufforderung.

Jetzt möchten Sie auch eine Lösungsdatei ( SuperCalc.sln) und eine Projektdatei ( SuperCalc.vcxproj& SuperCalc.vcxproj.filters) erstellen . Tun Sie dies in Visual Studio. Normalerweise befindet sich die Projektdatei in einem Unterordner des Lösungsverzeichnisses. Dies wird von Visual Studio automatisch für Sie erledigt. Wählen Sie einen Speicherort für die Lösungsdatei - diese sollte sich irgendwo in derselben Verzeichnisstruktur (Ordnerbaum) wie der Quellcode befinden. Ich würde vorschlagen, es neben das Quellverzeichnis zu stellen, in:

  • SuperCalc\Build

Gehen Sie in VS und wählen Sie File > New > Project > Visual Studio Solutions > Blank Solution File. Geben Sie der Lösung einen Namen (möglicherweise "SuperCalc") und einen Speicherort (den Speicherort, den wir gerade im SuperCalc\BuildVerzeichnis ausgewählt haben). Es wird die Lösungsdatei für Sie erstellen.

Klicken Sie nun im Projektmappen-Explorer mit der rechten Maustaste auf die Lösung ("Solution SuperCalc, 0 Projekte") und wählen Sie Add > New Project. Wählen Sie einen Namen - dies ist der Name Ihrer ausführbaren Programmdatei, wie "SuperCalc"! Wählen Sie Win32 , entweder Win32 Console Application (dies ist ein DOS-Konsolenprogramm) oder Win32 Project (dies ist ein gewöhnliches Windows-GUI-Programm). Normalerweise klicke ich dann auf Anwendungseinstellungen, um einige wichtige Änderungen vorzunehmen: Zum einen wähle ich "Leeres Projekt", weil ich nicht möchte, dass Visual Studio Dateien und Code für mich erstellt, es sei denn, ich sage es. Wenn alles so eingerichtet ist, wie ich es möchte, klicke ich auf FINISH.

Jetzt haben Sie Ihre Lösungsdatei und Ihr Projekt, die von Visual Studio erstellt wurden. Sie haben auch Ihren Quellcode oder zumindest die Verzeichnisstruktur (Ordnerbaum), in der sich Ihr Quellcode befindet, außerhalb von Visual Studio erstellt. Es ist Zeit, die beiden Dinge miteinander zu verbinden.

Wenn Sie möchten, können Sie alle Ihre Quelldateien im Filter Quelldateien Ihres Projekts auflisten. Obwohl sie aus verschiedenen Verzeichnissen (Eingabe, Matrix usw.) stammen, besteht keine erforderliche Beziehung zwischen den Speicherorten der Dateien auf der Festplatte und ihrem Erscheinungsbild im Projekt. Wenn Sie jedoch viele Dateien haben, ist es einfacher, "Unterfilter" zu erstellen, Filter innerhalb des Quelldateifilters zu erstellen und ihnen die Namen der Unterordner von Source zu geben. Auf diese Weise replizieren Sie die Struktur Ihrer Festplattenverzeichnisse in Ihrer Projektdatei.

Klicken Sie mit der rechten Maustaste auf den Quelldateifilter des "SuperCalc" -Projekts und wählen Sie "Hinzufügen"> "Neuen Filter hinzufügen". Geben Sie ihm den Namen Input(das erste der SuperCalc \ Source-Verzeichnisse). Erstellen Sie auch die Filter Mathund Output. Klicken Sie mit der rechten Maustaste auf den MathFilter und wählen Sie Hinzufügen> Neuen Filter hinzufügen, um einen Unterfilter mit dem Namen Matrix(innerhalb von Math) zu erstellen . Jetzt haben Sie diese Filter :

   SuperCalc
      Quelldaten
         Eingang
         Mathematik
            Matrix
         Ausgabe

Dies entspricht den Verzeichnissen (Ordnern), die Sie zuvor erstellt haben. Dies ist eine rein bequeme Anordnung für den Menschen . Visual Studio versteht nichts Besonderes. Wenn Sie VS nur anweisen, "eine Datei hinzuzufügen", wird die Datei nicht in den richtigen Filter eingefügt. Sie müssen ihm sagen, wo er es ablegen soll.

Um Ihre CPP-Dateien hinzuzufügen oder zu erstellen, wählen Sie den Filternamen aus, der dem Verzeichnis entspricht, in dem sich die CPP-Datei befindet. Um eine Datei hinzuzufügen oder zu erstellen SuperCalc\Source\Math\Matrix\matrix_multiply.cpp, klicken Sie Matrixim Projektmappen-Explorer mit der rechten Maustaste auf den Filter und wählen Sie Hinzufügen> Neue Datei hinzufügen oder Vorhandene Datei hinzufügen . (Vorhandene Datei hinzufügen ist gedacht, wenn Sie bereits matrix_multiply.cpp geschrieben haben und dem Projekt nur mitteilen möchten, wo es sich befindet.) Verwenden Sie das Dialogfeld, um zum Source\Math\MatrixVerzeichnis zu navigieren . Wiederholen Sie diesen Vorgang für alle Quelldateien in Ihrem gesamten Programm.

Sie hatten auch die Frage "Gibt es etwas Ähnliches wie $ (CURDIR), mit dem ich den Quelldateiordner einschließen könnte, ohne einen absoluten Pfad zu benötigen?" Sie haben Glück: Visual Studio-Projekte verwenden keine absoluten Pfade! Sie verwenden relative Pfade. In der Projektdatei wird der relative Pfad gespeichert, der erforderlich ist, um vom Verzeichnis mit der .vcxproj-Datei zum Verzeichnis mit der Quelldatei zu gelangen. Wenn Sie also erstellt haben SuperCalc.slnund SuperCalc.vcxprojwo ich vorgeschlagen habe (das SuperCalc\BuildVerzeichnis) und Ihre CPP-Dateien in den Quell-Unterverzeichnissen hinzugefügt haben, können Sie mit Notepad in die Datei SuperCalc.vcxproj schauen und sehen folgende Zeilen:

<ClCompile Include = ".. \ .. \ .. \ Source \ Math \ Matrix \ matrix_multiply.cpp" />

Da es keine absoluten Pfade gibt, können Sie den gesamten SuperCalc-Verzeichnisbaum an einen anderen Ort verschieben, und alles würde immer noch funktionieren. Keine Notwendigkeit für umgebungsvariable Hacks wie $ (CURDIR).

Eine letzte Sache, die Sie wissen sollten: Da Sie Ihre Quelldateien in mehreren Verzeichnissen #includeablegen, können Probleme mit den Headern, den .h- oder .hpp-Dateien auftreten. Sie müssen dem Compiler mitteilen, in welchen Verzeichnissen sich Ihre Header-Dateien befinden. Sie werden wahrscheinlich auf mehrere Verzeichnisse verteilt sein. Bearbeiten Sie also die Projekteinstellungen: Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, wählen Sie Eigenschaften und führen Sie einen Drilldown zu Konfigurationseigenschaften> C / C ++> Allgemein durch. Das erste Feld im Eigenschaftenblatt lautet "Zusätzliche Include-Verzeichnisse". Bevor Sie etwas anderes tun , klicken Sie auf das Dropdown-Menü Konfiguration und wählen Sie Alle Konfigurationen . Wenn Sie sowohl einen 32-Bit- als auch einen 64-Bit-Build haben, klicken Sie auf das Dropdown-Menü Plattform und wählen Sie Alle Plattformen. Gehen Sie nun zu "Additional Include Directories" und fügen Sie alle Pfade zu allen Quellverzeichnissen hinzu, wobei die Pfade relativ zum Verzeichnis der Projektdatei angegeben werden. Für das SuperCalc-Beispiel würde es also so aussehen:

.. \ .. \ .. \ Source \ Input; .. \ .. \ .. \ Source \ Math; .. \ .. \ .. \ Source \ Math \ Matrix; .. \ .. \ .. \ Quelle \ Ausgabe

Sobald diese Änderung vorgenommen wurde, kann eine Datei wie Source \ Math \ Matrix \ matrix_multiply.cpp eine Zeile enthalten

#include "input_configuration.hpp"

# eine Datei aus dem Eingabeverzeichnis einschließen, und alles wird einfach funktionieren.

(Wenn nicht alles nur funktioniert, gehen Sie normalerweise zu den Projekteigenschaften zurück und spielen Sie mit der Anzahl der ..\Sequenzen vor Ihren zusätzlichen Include-Verzeichnissen. Denken Sie daran, dass Sie bei jeder Änderung alle Konfigurationen auswählen müssen wieder - andernfalls gelten Ihre Änderungen nur für die aktuelle Konfiguration (Debug oder Release). Diese Einstellung bleibt nicht erhalten .)

Librik
quelle
1
Sie können auch Benutzermakros definieren, z. $ (Quelle) über ein Eigenschaftenblatt (.props). Ich empfehle, so viele Projekteinstellungen wie möglich in Eigenschaftenblättern vorzunehmen, da viele Projekte möglicherweise Einstellungen gemeinsam nutzen.
Ben L
2
Gute Antwort. Ich erstelle Filter, die meiner Verzeichnisstruktur entsprechen, aber ich habe immer wieder Kopfschmerzen, die Sie ein wenig berührt haben. VS hat keine Ahnung, dass meine Filter mit Verzeichnissen verknüpft sind. Dies wird zu einem Problem, wenn ich Code nacheinander hinzufüge: foo.h, foo.c, bar.h, bar.c. Ich muss daran denken, das Verzeichnis immer wieder an den richtigen Ort zu ändern. VC ++ merkt sich Ihr letztes Verzeichnis und ist immer einen Schritt zurück. Ich habe MS einen Vorschlag gemacht, Verzeichnisse mit Filtern zu verknüpfen. Es ist hier. Bitte stimmen Sie diesem Vorschlag zu, wenn Sie dies auch stört. tinyurl.com/bud4zsv
bigh_29
1
Süss! In der Community 2015 befindet sich eine leere Lösung unter Neu> Projekt ...> Andere Projekttypen> Visual Studio-Lösungen> Leere Lösung
Ryan S
24

Es ist tatsächlich möglich, die physische Dateistruktur über Visual Studio anzuzeigen (und zu bearbeiten), wie in diesem SO-Beitrag beschrieben :

Die Header- / Quelldatei ist keine von Visual Studio auferlegte Anforderung. Das ist nur das Standardlayout und es ist virtuell, nicht physisch. Wenn Sie im Lösungs-Explorer auf "Alle Dateien anzeigen" klicken, wird der Ordnerbaum so angezeigt, wie er sich auf der Festplatte befindet. Sie können ihn nach Belieben bearbeiten.

Morgancodes
quelle
1
Du hast meinen Tag gemacht! Vielen Dank! Ich habe nur eine Frage: Warum wird es nicht von defaut für leeres Prohekt gesetzt? @thomthom "Ich habe seit Stunden nach einer solchen Lösung gesucht!" - ich auch)
Maks
3

Ich bin spät dran, rate aber von der akzeptierten Antwort ab. Der Hauptgrund für die Code- Portabilität . Stattdessen empfehle ich:

  1. So erstellen Sie das Layout von Ordnern und Unterordnern außerhalb von Visual Studio (wie die akzeptierte Antwort, aber die nächsten Punkte sind unterschiedlich). Erstellen Sie in jedem Unterordner einen Ordner includeundsrc
  2. Fügen Sie dann unter Konfigurationseigenschaften> C / C ++> Allgemein> "Zusätzliche Include-Verzeichnisse" (für alle Konfigurationen und alle Plattenformen) einen einzelnen Ordner hinzu, der die Basis Ihres gesamten Unterordners bildet.
  3. So fügen Sie src-Dateien hinzu und fügen Dateien in diese Unterordner ein.

  4. Schließen Sie schließlich jede Header-Datei mit den Pfaden der Verwandten zu diesem Basisordner ein.

Um es klar zu sagen: Wenn das Layout Ihres Projekts wie folgt ist:

MyProjet
   Math
     include
       random.h
       functions.h
     src
       random.cpp
       functions.cpp
   Probability
      include
        normal.h
      src
        normal.cpp

Sie sollten in functions.cppder folgenden include-Anweisung haben:

#include"Math/include/functions.h"

Wenn Sie den normalCode auch in functions.cpp verwenden müssen, sollte der obere Teil folgendermaßen functions.cppaussehen:

#include"Math/include/functions.h"
#include"Probability/include/normal.h"

Auf diese Weise können Sie Ihren Math-Unterordner problemlos in einem anderen Projekt (B) wiederverwenden: Fügen Sie einfach den MyProjectBasisordner in die "Additional Include Directories" von Projekt B ein.

Der entscheidende Punkt ist, dass nur ein Basisordner in der Eigenschaft "Additional Include Directories" enthalten ist.

ps: Die Intellisense-Funktion von VS 2015 hilft beim Schreiben der #include...

Malick
quelle
3
Das ist ziemlich spröde. Es ist besser, Suchverzeichnisse dem Compiler zuzuführen, als die Headerpfade des gehörten Codes in die Quelldatei.
ThomasMcLeod
1
Ich habe mir gerade die Skia-Bibliothek von Google angesehen und sie verwenden die vollständigen Pfade in ihren include-Anweisungen, wobei sie ziemlich tiefe Ebenen von Unterordnern verwenden. Ich würde lieber sehen #include "superlib/defines.h"als#include "defines.h" // I don't know where this came from
Erik Bongers
0

Die Verwendung eines Build-Systems wie CMake oder Premake kann beim Organisieren von Dateien hilfreich sein und bietet den zusätzlichen Vorteil, dass Sie Ihren Code auf andere Plattformen portieren können. Hier ist eine gute Präsentation zu diesem Thema.

Da dies für jemanden hilfreich sein könnte, sollte ich auch hinzufügen, dass *.vcxprojes schwieriger ist, neue Dateien zu erstellen , wenn Ihre Quelldateien von Ihrer Projektdatei ( ) getrennt sind , da Visual Studio standardmäßig neue Dateien im selben Ordner wie Ihre erstellen möchte Projekt. Die Problemumgehung für dieses Problem, die ich bisher gefunden habe, ist die Verwendung der Erweiterung Visual Assists, da damit neue Dateien relativ zum Verzeichnis oder Ihrer aktuell geöffneten Datei hinzugefügt werden können. Weitere Erläuterungen finden Sie in diesem Beitrag.

Adelost
quelle
-3

Wenn Sie Ihre Lösung und Ihr Projekt an einem anderen Ort als Ihrem Quellcode erstellen möchten, können Sie Ihr Arbeitsverzeichnis ändern:

Project > Properties > Configuration Properties > Debugging > Working Directory

Casey
quelle