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)

Sehen Sie live auf Coliru

  1. cmake_minimum_required(VERSION 2.4) legt eine minimale CMake-Version fest, die zum Auswerten des aktuellen Skripts erforderlich ist.

  2. 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 ++.

  3. 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ührbare app aus der angegebenen Quelldatei main.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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow