Ich codiere unter C / C ++ und verwende ein (GNU) Makefile, um den Code zu kompilieren. Ich kann dasselbe mit CMake machen und ein MakeFile bekommen. Was ist jedoch der Unterschied zwischen der Verwendung von Makefile und CMake zum Kompilieren des Codes?
288
Antworten:
Make (oder besser gesagt ein Makefile) ist ein Buildsystem - es steuert den Compiler und andere Build-Tools, um Ihren Code zu erstellen.
CMake ist ein Generator von Buildsystemen. Es kann Makefiles erzeugen, es kann Ninja-Build-Dateien erzeugen, es kann KDEvelop- oder Xcode-Projekte erzeugen, es kann Visual Studio-Lösungen erzeugen. Aus demselben Startpunkt dieselbe CMakeLists.txt-Datei. Wenn Sie also ein plattformunabhängiges Projekt haben, können Sie es mit CMake auch systemunabhängig machen.
Wenn Sie Windows-Entwickler an Visual Studio- und Unix-Entwickler gewöhnt haben, die auf GNU Make schwören, ist CMake der richtige Weg.
Ich würde immer empfehlen, CMake (oder einen anderen Buildsystem-Generator, aber CMake ist meine persönliche Präferenz) zu verwenden, wenn Sie beabsichtigen, dass Ihr Projekt plattformübergreifend oder allgemein verwendbar ist. CMake selbst bietet auch einige nette Funktionen wie Abhängigkeitserkennung, Verwaltung der Bibliotheksschnittstelle oder Integration in CTest, CDash und CPack.
Die Verwendung eines Buildsystem-Generators macht Ihr Projekt zukunftssicherer. Selbst wenn Sie jetzt nur GNU-Make sind, was ist, wenn Sie sich später für eine Erweiterung auf andere Plattformen entscheiden (sei es Windows oder etwas Eingebettetes) oder einfach nur eine IDE verwenden möchten?
quelle
find_package()
) oder die Unterstützung von Tests / Verpackungen.Die Aussage, dass CMake ein "Build-Generator" ist, ist ein weit verbreitetes Missverständnis.
Es ist technisch nicht falsch; Es beschreibt nur, wie es funktioniert, aber nicht, was es tut.
Im Kontext der Frage machen sie dasselbe: Nehmen Sie eine Reihe von C / C ++ - Dateien und verwandeln Sie sie in eine Binärdatei.
Was ist der wahre Unterschied?
CMake ist viel höherrangig. Es ist auf das Kompilieren von C ++ zugeschnitten, für das Sie viel weniger Build-Code schreiben, kann aber auch für allgemeine Builds verwendet werden.
make
Es gibt auch einige integrierte C / C ++ - Regeln, die jedoch meistens unbrauchbar sind.CMake
führt einen zweistufigen Build durch: Es generiert ein Build-Skript auf niedriger Ebene inninja
odermake
oder vielen anderen Generatoren, und dann führen Sie es aus. Alle Shell-Skript-Teile, in die normalerweise gestapelt wird,Makefile
werden nur in der Generierungsphase ausgeführt. Somit kann derCMake
Build um Größenordnungen schneller sein.Die Grammatik von
CMake
ist für externe Tools viel einfacher zu unterstützen als für make .Sobald
make
ein Artefakt erstellt wurde, vergisst es, wie es erstellt wurde. Aus welchen Quellen wurde es erstellt, aus welchen Compiler-Flags?CMake
verfolgt es,make
überlässt es Ihnen. Wenn eine der Bibliotheksquellen seit der vorherigen Version von entfernt wurdeMakefile
,make
wird sie nicht neu erstellt.Modern
CMake
(ab Version 3.something) arbeitet in Bezug auf Abhängigkeiten zwischen "Zielen". Ein Ziel ist (leider) immer noch eine einzelne Otput-Datei, kann jedoch transitive Abhängigkeiten ("öffentliche" / "Schnittstelle" in CMake-Begriffen) aufweisen. Diese transitiven Abhängigkeiten können den abhängigen Paketen ausgesetzt oder vor ihnen verborgen sein.CMake
verwaltet auch Verzeichnisse für Sie. Mitmake
stecken Sie auf einer Ebene von Datei zu Datei fest und verwalten Verzeichnisse von Hand.Sie könnten etwas codieren,
make
indem Sie Flag-Dateien verwenden, um die letzten beiden Lücken zu schließen, aber Sie sind allein.make
enthält eine vollständige Turing-Sprache (sogar zwei, manchmal drei, die Guile zählen ), und alle sind schrecklich.Um ehrlich zu sein, ist es das , was
CMake
undmake
haben gemeinsam - ihre Sprachen sind ziemlich schrecklich:beginnen mit.
Aber
CMake
Sie schreiben viel weniger Codezeilen.quelle