Das Einrichten eines neuen C ++ - Projekts erfordert in der Regel eine erhebliche Menge an Vorbereitungs- und Boilerplate -Code, noch mehr für moderne C ++ - Projekte mit Tests, ausführbaren und kontinuierlichen Integration. Diese Vorlage ist das Ergebnis von Erkenntnissen aus vielen früheren Projekten und sollte dazu beitragen, die für die Einrichtung eines modernen C ++ - Projekts erforderlichen Arbeiten zu verringern.
Greeter bedeutet den Namen des Projekts, während greeter in Dateinamen verwendet wird.include/greeter umzubenennen, um den Kleinbuchstaben Ihres Projekts zu verwenden und alle relevanten #include s zu aktualisieren.CODECOV_TOKEN hinzuSchließlich können Sie alle nicht verwendeten Dateien wie das eigenständige Verzeichnis oder irrelevante GitHub -Workflows für Ihr Projekt entfernen. Fühlen Sie sich frei, die Lizenz durch eine für Ihr Projekt geeignet zu ersetzen.
Um den Bibliothek und den Subproject-Code sauber zu trennen, definiert der äußere CMakeList.txt nur die Bibliothek selbst, während die Tests und andere Unterprojekte in ihren eigenen Verzeichnissen in sich geschlossen sind. Während der Entwicklung ist es normalerweise bequem, alle Unterprojekte gleichzeitig zu erstellen.
Verwenden Sie den folgenden Befehl, um das ausführbare Ziel zu erstellen und auszuführen.
cmake -S standalone -B build/standalone
cmake --build build/standalone
./build/standalone/Greeter --helpVerwenden Sie die folgenden Befehle aus dem Stammverzeichnis des Projekts, um die Testsuite auszuführen.
cmake -S test -B build/test
cmake --build build/test
CTEST_OUTPUT_ON_FAILURE=1 cmake --build build/test --target test
# or simply call the executable:
./build/test/GreeterTests Führen Sie CMake mit der Option -DENABLE_TEST_COVERAGE=1 aus, um Codeabdeckungsinformationen zu sammeln.
Verwenden Sie die folgenden Befehle aus dem Root -Verzeichnis des Projekts, um den C ++ - und den CMake -Quellstil zu beheben. Dies erfordert, dass Clang-Format , CMake-Format und Pyyaml auf dem aktuellen System installiert werden.
cmake -S test -B build/test
# view changes
cmake --build build/test --target format
# apply changes
cmake --build build/test --target fix-formatWeitere Informationen finden Sie unter format.cmake. Diese Abhängigkeiten können einfach mit PIP installiert werden.
pip install clang-format==14.0.6 cmake_format==0.6.11 pyyamlDie Dokumentation wird automatisch erstellt und veröffentlicht, wenn eine Github -Version erstellt wird. Um die Dokumentation manuell zu erstellen, rufen Sie den folgenden Befehl an.
cmake -S documentation -B build/doc
cmake --build build/doc --target GenerateDocs
# view the docs
open build/doc/doxygen/html/index.htmlUm die Dokumentation lokal zu erstellen, benötigen Sie Doxygen, Jinja2 und Pygmente, die auf Ihrem System installiert sind.
Das Projekt enthält auch ein all -Verzeichnis, mit dem gleichzeitig alle Ziele erstellt werden können. Dies ist während der Entwicklung nützlich, da es alle Unterprojekte Ihrer IDE aussetzt und redundante Builds der Bibliothek vermeidet.
cmake -S all -B build
cmake --build build
# run tests
./build/test/GreeterTests
# format code
cmake --build build --target fix-format
# run standalone
./build/standalone/Greeter --help
# build docs
cmake --build build --target GenerateDocsDie Test- und Standalone-Unterprojekte enthalten die Tools.cMake-Datei, mit der zusätzliche Tools on-Demand durch CMake-Konfigurationsargumente importiert werden. Die folgenden werden derzeit unterstützt.
Sanitärer können aktiviert werden, indem CMake mit -DUSE_SANITIZER=<Address | Memory | MemoryWithOrigins | Undefined | Thread | Leak | 'Address;Undefined'> .
Statische Analysatoren können aktiviert werden, indem -DUSE_STATIC_ANALYZER=<clang-tidy | iwyu | cppcheck> oder eine Kombination aus Zitatmarken, die durch Semikolonen getrennt sind. Standardmäßig finden Analysatoren automatisch Konfigurationsdateien wie .clang-format . Zusätzliche Argumente können an die Analysatoren übergeben werden, indem die Variablen CLANG_TIDY_ARGS , IWYU_ARGS oder CPPCHECK_ARGS festgelegt werden.
CCache kann durch Konfigurieren mit -DUSE_CCACHE=<ON | OFF> aktiviert werden. -DUSE_CCACHE=<ON | OFF> .
Kann ich dies für nur Header-Bibliotheken verwenden?
Ja, Sie müssen jedoch den Bibliothekstyp in eine INTERFACE ändern, wie in CMakelists.txt dokumentiert. Hier finden Sie eine Beispiel-Header-Bibliothek anhand der Vorlage.
Ich brauche kein eigenständiges Ziel / eine eigenständige Dokumentation. Wie kann ich es loswerden?
Entfernen Sie einfach das eigenständige / dokumentationsverzeichnis und laut GitHub Workflow -Datei.
Kann ich den Standalone und Tests gleichzeitig bauen? / Wie kann ich meine Ideen über alle Unterprojekte erzählen?
Um die Vorlage modular zu halten, wurden alle von der Bibliothek abgeleiteten Unterprojekte in ihre eigenen CMake -Module unterteilt. Dieser Ansatz macht es für Projekte von Drittanbietern, den Projektbibliothekscode wiederzuverwenden. Damit die IDEs den vollständigen Umfang des Projekts sehen können, enthält die Vorlage das all Verzeichnis, das einen einzelnen Build für alle Unterprojekte erstellt. Verwenden Sie dies als Hauptverzeichnis für die beste IDE -Unterstützung.
Ich sehe, dass Sie
GLOBverwenden, um Quelldateien in cmakelists.txt hinzuzufügen. Ist das nicht böse?
Glob wird als schlecht angesehen, da Änderungen an der Quelldateistruktur möglicherweise nicht automatisch von den Bauherren von CMAKE erfasst werden und Sie CMAKE auf Änderungen manuell aufrufen müssen. Ich persönlich bevorzuge die GLOB -Lösung für ihre Einfachheit, kann sie aber gerne so ändern, dass sie explizit Quellen auflistet.
Ich möchte zusätzliche Ziele erstellen, die von meiner Bibliothek abhängen. Sollte ich die Hauptcmakelisten so ändern, dass sie sie einbeziehen?
Vermeiden Sie es, abgeleitete Projekte aus den Bibliotheken Cmakelisten einzubeziehen (obwohl es sich um einen häufigen Anblick in der C ++ - Welt handelt), da dies den Abhängigkeitsbaum effektiv umdreht und das Build -System schwierig macht. Erstellen Sie stattdessen ein neues Verzeichnis oder ein neues Projekt mit einem Cmakelisten, das die Bibliothek als Abhängigkeit hinzufügt (z. B. das eigenständige Verzeichnis). Je nach Typ kann es sinnvoll sein, diese Komponenten in eine separate Repositorys zu verschieben und auf ein bestimmtes Commit oder eine bestimmte Version der Bibliothek zu verweisen. Dies hat den Vorteil, dass einzelne Bibliotheken und Komponenten unabhängig verbessert und aktualisiert werden können.
Sie empfehlen, externe Abhängigkeiten mit CPM.CMake hinzuzufügen. Wird dies Benutzer meiner Bibliothek dazu zwingen, auch CPM.Cmake zu verwenden?
CPM.Cmake sollte für Bibliotheksbenutzer unsichtbar sein, da es sich um ein in sich geschlossenes CMake-Skript handelt. Wenn Probleme auftreten, können Benutzer sich jederzeit entscheiden, indem sie die variablen CMake- oder Env-variablen CPM_USE_LOCAL_PACKAGES definieren, wodurch alle Aufrufe bei CPMAddPackage mit dem Anruf von find_package überschreiben sind. Dies sollte es Benutzern auch ermöglichen, das Projekt mit ihrem bevorzugten externen C ++ - Abhängigkeitsmanager wie VCPKG oder Conan zu verwenden.
Kann ich mein Projekt offline konfigurieren und erstellen?
Für das Erstellen des Projekts ist jedoch keine Internetverbindung erforderlich. Bei der Verwendung von CPM -Fehlenden werden jedoch zur Konfiguration des Zeitpunkts heruntergeladen. Um redundante Downloads zu vermeiden, wird dringend empfohlen export CPM_SOURCE_CACHE=$HOME/.cache/CPM ein CPM.CMake -Cache -Verzeichnis festzulegen, z. Dies ermöglicht flache Klone und ermöglicht die Abhängigkeiten von Offline -Konfigurationen, die bereits im Cache verfügbar sind.
Kann ich CPack verwenden, um ein Paketinstallateur für mein Projekt zu erstellen?
Da es viele mögliche Optionen und Konfigurationen gibt, liegt dies (noch) im Bereich dieser Vorlage nicht. Weitere Informationen zum Einrichten von CPack -Installateuren finden Sie in der CPack -Dokumentation.
Das ist zu viel, ich möchte nur mit C ++ - Code spielen und einige Bibliotheken testen.
Vielleicht ist der Minicppstarter etwas für Sie!