Neulingsfrage. Ich bin kürzlich auf ein Projekt gestoßen, das viele Dateien und externe Bibliotheken enthielt. Einige dieser Bibliotheken enthielten Makefiles und CMakeLists.txt. Ich baue ein ähnliches Projekt auf, das externe Bibliotheken einbezieht. Ist es notwendig, sowohl CMake als auch make zu lernen? Oder reicht CMake aus?
CMake oder machen. Brauche ich beides?
Florian
So gestalten Sie das Konzept hinter CMake
Es ist nicht nötig, das Schreiben eines zu lernen makefile
da CMake ein ist Abstraktionsschicht oder „meta-make“ generiert die Makefiles für Sie. Und wie bei jeder Abstraktionsschicht müssen Sie nur lernen, ihre Funktionen zu nutzen. Sie müssen aber auch die Aufgabe verstehen, für die es entwickelt wurde. In diesem Fall zB Was ist ein Build-Tool? oder Was ist eine native Build-Umgebung?
Wofür steht das „c“ in cmake?
Aber cmake – in Kombination mit ctest, cpack und cdash – ist viel mehr als das: Es macht (meistens) das Erlernen der Compiler-/Linker-Schalter, der Handhabung von Bibliotheken/ausführbaren Dateien und deren Installation durch Ihre Plattformen/Frameworks usw. überflüssig.
- Cross-Compile
- Es unterstützt viele verschiedene Ausgabeformate für Build-Umgebungen, die in zusammengefasst sind CMake-Generatoren
- Es abstrahiert beispielsweise die spezifischen Compiler-Schalter CMake-Kompilierungsfunktionen
- Plattformübergreifend
- Es funktioniert auf allen Arten von Betriebssystemen (zusammengefasst unter CMakes Download-Seite) mit unterschiedlichen Setups
- Es funktioniert mit vielen IDEs oder ist direkt in diese integriert Herausgeber wie zB Visual Studio oder CLion
- Es kann auf bestimmte Zielplattformen wie z. B. Cross-Kompilierung durchgeführt werden Android zusammengefasst in CMake-Toolchains
- Sprachübergreifend
- Es unterstützt hauptsächlich C/C++, unterstützt aber auch z. B. Asm, RC, Fortran und with CMake-Version 3.8 C#
- Da eine mittelgroße Skriptsprache eingebettet ist, entfällt die Notwendigkeit, andere Skriptsprachen zu erlernen (die häufig zum Durchführen von Schritten vor oder nach dem Erstellen verwendet werden).
Unterschied zwischen der Verwendung von Makefile und cmake zum Kompilieren des Codes
Aus meiner Erfahrung mit der Verwendung von CMake in meinen Projekten:
-
Der Nachteil: Sie müssen es in allen Zielumgebungen testen (zugegebenermaßen ist das nichts Spezifisches für CMake). In einer geschlossenen Umgebung (z. B. innerhalb eines Unternehmens) ist die Wartung relativ einfach, aber beispielsweise in einer Open-Source-Umgebung wird es immer den einen oder anderen Präzedenzfall geben, bei dem Sie Ihr CMake-Skript ein wenig optimieren müssen.
-
Der Vorteil: CMake wird in C/C++-Projekten häufig verwendet/unterstützt und gibt mir als potenziellem Benutzer Ihres Projekts die Möglichkeit, meine Build-Umgebung zu nutzen und das Tool meiner Wahl auszuwählen (z. B. habe ich es ersetzt).
make
mitninja
in meinen Projekten).
Verweise
- C++-Build-Systeme – Was verwenden?
- C++-Build-Systeme
CMake ist ein Makefile-Generator (und andere Projektdateien). Du musst nicht lernen make
es sei denn, Sie möchten eine Verbindung zu CMake selbst herstellen.
Allerdings etwas klassisch make
Kenntnisse sind immer noch nützlich, wie zum Beispiel:
- Vorbeigehen an der
-j
Flag für Parallel make V=1
für ausführliche Ausgabemake clean
zur Reinigungmake install
und dasDESTDIR
Parameter
CMake ist ein Meta-Buildsystem.
Benutzen cmake
und die Einstellungen in CMakeLists.txt
CMake wird generieren die Build-Dateien für die Zielplattform. Das können Makefiles, Visual Studio-Lösungen, Ninja-Dateien, KDevelop-Projektdateien usw. sein.
Wenn das Projekt für die Verwendung von CMake eingerichtet ist, sollten Sie dies nicht einmal tun müssen sehen an den Buildfiles (Makefiles) generiert. Sie sind streng vorübergehend.
-
@Rienhart_: Darf ich schamlos Werbung machen? Kiefer – ein gebrauchsfertiges CMake-Setup, das ich selbst erstellt habe und das eine Menge „Präsentation“ leistet, die mir in der offiziellen Dokumentation fehlte? Es könnte für Sie hilfreich sein, die Funktionsweise von CMake zu verstehen.
– DevSolar
27. April 2017 um 9:27 Uhr