cmake Tutorial
Erste Schritte mit cmake
Suche…
Bemerkungen
CMake ist ein Tool zum Definieren und Verwalten von Code-Builds, hauptsächlich für C ++.
CMake ist ein plattformübergreifendes Tool. Die Idee besteht darin, eine einzige Definition für die Erstellung des Projekts zu haben, die in spezifische Build-Definitionen für jede unterstützte Plattform umgesetzt wird.
Dies wird durch die Kombination mit verschiedenen plattformspezifischen Buildsystemen erreicht. CMake ist ein Zwischenschritt, der Build-Input für verschiedene spezifische Plattformen generiert. Unter Linux generiert CMake Makefiles. Unter Windows können Visual Studio-Projekte usw. erstellt werden.
Das Build-Verhalten wird in CMakeLists.txt
Dateien definiert - eine in jedem Verzeichnis des Quellcodes. Die CMakeLists
Datei jedes Verzeichnisses definiert, was das Buildsystem in diesem bestimmten Verzeichnis tun soll. Es definiert auch, welche Unterverzeichnisse CMake behandeln soll.
Typische Aktionen umfassen:
- Erstellen Sie aus einigen Quelldateien in diesem Verzeichnis eine Bibliothek oder eine ausführbare Datei.
- Fügen Sie dem während des Builds verwendeten Include-Pfad einen Dateipfad hinzu.
- Definieren Sie Variablen, die das Buildsystem in diesem Verzeichnis und in seinen Unterverzeichnissen verwendet.
- Generieren Sie eine Datei basierend auf der spezifischen Build-Konfiguration.
- Suchen Sie eine Bibliothek, die sich irgendwo im Quellbaum befindet.
Die endgültigen CMakeLists
Dateien können sehr klar und unkompliziert sein, da sie jeweils nur einen begrenzten Umfang haben. Jeder verarbeitet nur so viel des Builds, wie im aktuellen Verzeichnis vorhanden ist.
Offizielle Informationen zu CMake finden Sie in der Dokumentation und dem Lernprogramm von CMake.
Versionen
Ausführung | Veröffentlichungsdatum |
---|---|
3.9 | 2017-07-18 |
3.8 | 2017-04-10 |
3.7 | 2016-11-11 |
3.6 | 2016-07-07 |
3,5 | 2016-03-08 |
3.4 | 2015-11-12 |
3.3 | 2015-07-23 |
3.2 | 2015-03-10 |
3.1 | 2014-12-17 |
3,0 | 2014-06-10 |
2.8.12.1 | 2013-11-08 |
2.8.12 | 2013-10-11 |
2.8.11 | 2013-05-16 |
2.8.10.2 | 2012-11-27 |
2.8.10.1 | 2012-11-07 |
2.8.10 | 2012-10-31 |
2.8.9 | 2012-08-09 |
2.8.8 | 2012-04-18 |
2.8.7 | 2011-12-30 |
2.8.6 | 2011-12-30 |
2.8.5 | 2011-07-08 |
2.8.4 | 2011-02-16 |
2.8.3 | 2010-11-03 |
2.8.2 | 2010-06-28 |
2.8.1 | 2010-03-17 |
2.8 | 2009-11-13 |
2.6 | 2008-05-05 |
CMake-Installation
Besuchen Sie die CMake- Downloadseite, und erhalten Sie eine Binärdatei für Ihr Betriebssystem, z. B. Windows, Linux oder Mac OS X. Klicken Sie unter Windows doppelt auf die zu installierende Binärdatei. Führen Sie unter Linux die Binärdatei von einem Terminal aus.
Unter Linux können Sie die Pakete auch über den Paketmanager der Distribution installieren. Auf Ubuntu 16.04 können Sie die Befehlszeilen- und Grafikanwendung installieren mit:
sudo apt-get install cmake
sudo apt-get install cmake-gui
Auf FreeBSD können Sie die Befehlszeile und die Qt-basierte grafische Anwendung mit folgendem Befehl installieren:
pkg install cmake
pkg install cmake-gui
Wenn Sie unter Mac OSX einen der zur Verfügung stehenden Paketmanager verwenden, um Ihre Software zu installieren, insbesondere MacPorts ( MacPorts ) und Homebrew ( Homebrew ), können Sie CMake auch über einen dieser Programme installieren. Geben Sie im Fall von MacPorts beispielsweise Folgendes ein
sudo port install cmake
installiert CMake, während Sie den Homebrew-Paketmanager verwenden, den Sie eingeben
brew install cmake
Nachdem Sie CMake installiert haben, können Sie dies ganz einfach überprüfen
cmake --version
Sie sollten etwas Ähnliches wie das Folgende sehen
cmake version 3.5.1
CMake suite maintained and supported by Kitware (kitware.com/cmake).
Wechseln zwischen Build-Typen, z. B. Debug und Release
CMake kennt mehrere Build-Typen, die normalerweise die Standard-Compiler- und Linker-Parameter (z. B. erstellte Debugging-Informationen) oder alternative Codepfade beeinflussen.
Standardmäßig kann CMake die folgenden Build-Typen verarbeiten:
- Debug : Normalerweise ein klassischer Debug-Build mit Debugging-Informationen, keine Optimierung usw.
- Release : Ihr typischer Release-Build ohne Debugging-Informationen und vollständige Optimierung.
- RelWithDebInfo:: Wie Release , jedoch mit Debugging-Informationen.
- MinSizeRel : Ein spezieller Release- Build, der für die Größe optimiert wurde.
Wie Konfigurationen gehandhabt werden, hängt von dem verwendeten Generator ab.
Einige Generatoren (wie Visual Studio) unterstützen mehrere Konfigurationen. CMake generiert alle Konfigurationen gleichzeitig und Sie können aus der IDE oder mit --config CONFIG
(mit cmake --build
) cmake --build
welche Konfiguration Sie erstellen möchten. Für diese Generatoren versucht CMake, eine Build-Verzeichnisstruktur so zu erstellen, dass Dateien aus verschiedenen Konfigurationen nicht aufeinanderfolgen.
Generatoren, die nur eine einzige Konfiguration unterstützen (wie Unix Makefiles), funktionieren anders. Hier wird die aktuell aktive Konfiguration durch den Wert der CMake-Variablen CMAKE_BUILD_TYPE
.
Wenn Sie beispielsweise einen anderen Build-Typ auswählen möchten, können Sie die folgenden Befehlszeilenbefehle ausgeben:
cmake -DCMAKE_BUILD_TYPE=Debug path/to/source
cmake -DCMAKE_BUILD_TYPE=Release path/to/source
Ein CMake-Skript sollte es vermeiden, CMAKE_BUILD_TYPE
selbst CMAKE_BUILD_TYPE
, da dies in der Regel die Verantwortung des Benutzers darstellt.
Für Generatoren mit einer einzigen Konfiguration muss für die Konfiguration CMake erneut ausgeführt werden. Ein nachfolgender Build überschreibt wahrscheinlich Objektdateien, die von der vorherigen Konfiguration erstellt wurden.
Einfaches "Hello World" -Projekt
Bei einer C ++ - Quelldatei main.cpp
, die eine main()
Funktion definiert, wird CMake durch eine begleitende CMakeLists.txt
Datei (mit folgendem Inhalt) aufgefordert, die entsprechenden Build-Anweisungen für das aktuelle System und den Standard-C ++ - Compiler zu generieren.
main.cpp ( C ++ Hello World-Beispiel )
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.4)
project(hello_world)
add_executable(app main.cpp)
cmake_minimum_required(VERSION 2.4)
legt eine minimale CMake-Version fest, die zum Auswerten des aktuellen Skripts erforderlich ist.project(hello_world)
startet ein neues CMake-Projekt. Dies löst eine Menge interner CMake-Logik aus, insbesondere die Erkennung des Standard-Compilers C und C ++.Mit
add_executable(app main.cpp)
eine Build-Ziel-app
erstellt, die den konfigurierten Compiler mit einigen Standardflags für die aktuelle Einstellung aufruft, um eine ausführbareapp
aus der angegebenen Quelldateimain.cpp
zu kompilieren.
Befehlszeile (In-Source-Build, nicht empfohlen)
> cmake .
...
> cmake --build .
cmake .
führt die Compiler-Erkennung aus, wertet die CMakeLists.txt
in der angegebenen aus .
Verzeichnis und generiert die Build-Umgebung im aktuellen Arbeitsverzeichnis.
Das cmake --build .
Befehl ist eine Abstraktion für den erforderlichen Aufruf von build / make.
Befehlszeile (Out-of-Source, empfohlen)
Um den Quellcode von Build-Artefakten frei zu halten, sollten Sie Builds "out-of-source" ausführen.
> mkdir build
> cd build
> cmake ..
> cmake --build .
Oder CMake kann auch die grundlegenden Befehle Ihrer Plattform-Shell vom obigen Beispiel abstrahieren:
> cmake -E make_directory build
> cmake -E chdir build cmake ..
> cmake --build build
"Hello World" mit mehreren Quelldateien
Zuerst können wir die Verzeichnisse der Header-Dateien mit include_directories()
angeben, dann müssen wir die entsprechenden Quelldateien der Zieldatei mit add_executable()
und sicherstellen, dass in den Quelldateien genau eine main()
Funktion vorhanden ist.
Es folgt ein einfaches Beispiel. Es wird angenommen, dass sich alle Dateien im Verzeichnis PROJECT_SOURCE_DIR
.
main.cpp
#include "foo.h"
int main()
{
foo();
return 0;
}
foo.h
void foo();
foo.cpp
#include <iostream>
#include "foo.h"
void foo()
{
std::cout << "Hello World!\n";
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.4)
project(hello_world)
include_directories(${PROJECT_SOURCE_DIR})
add_executable(app main.cpp foo.cpp) # be sure there's exactly one main() function in the source files
Wir können dasselbe Verfahren wie im obigen Beispiel befolgen, um unser Projekt zu erstellen. Dann wird die Ausführung der app
gedruckt
>./app
Hello World!
"Hello World" als Bibliothek
Dieses Beispiel zeigt, wie Sie das Programm "Hello World" als Bibliothek bereitstellen und mit anderen Zielen verknüpfen.
Nehmen wir an, wir haben die gleichen Quell- / Header-Dateien wie im Beispiel http://www.riptutorial.com/cmake/example/22391/-hello-world--with-multiple-source-files . Anstatt aus mehreren Quelldateien zu erstellen, können wir zuerst foo.cpp
als Bibliothek add_library()
indem Sie add_library()
und anschließend mit dem Hauptprogramm mit target_link_libraries()
.
Wir ändern CMakeLists.txt in
cmake_minimum_required(VERSION 2.4)
project(hello_world)
include_directories(${PROJECT_SOURCE_DIR})
add_library(applib foo.cpp)
add_executable(app main.cpp)
target_link_libraries(app applib)
und nach den gleichen Schritten erhalten wir dasselbe Ergebnis.