namespace cpp {}

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


lernen:cmake
no way to compare when less than two revisions

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.


lernen:cmake [2020-08-23 20:03] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +====== CMake ======
 +
 +Um aus C++-Quelltexten ausführbare Programme zu machen, sind je nach System andere Schritte notwendig. In Entwicklungsumgebungen werden Projekte erstellt, Quelltexte registriert, Einstellungen für das Projekt vorgenommen. Beschreibungen “klicke hier, klicke da, drücke F5” erspare ich mir. Auch Kommandozeilenbefehle unterscheiden sich je nach Compiler (''%%g++%%'', ''%%cl%%'', ''%%make%%'', ''%%nmake%%'', …).
 +
 +Das Ziel von [[https://cmake.org/|CMake]] (cross-platform make) ist, den Übersetzungsvorgang compiler- und systemunabhängig zu automatisieren. [[https://www.google.com/search?q=modern+cmake|Modern CMake]] formuliert den Bau von Projekten über Targets und deren Eigenschaften, vom Finden benötigter Bibliotheken und Pakete bis zu Installation und Continuous Integration.
 +
 +===== Ein erstes Projekt erstellen =====
 +
 +CMake beschreibt das Projekt in menschenlesbarer Form. In der Datei ''%%CMakeLists.txt%%'' folgen nach Versionsanforderung und Projektname die zu erzeugenden Ziele (Targets). Das einzige Ziel hier ist das ausführbare ''%%programm%%'', dessen Quelltext sich im Unterverzeichnis ''%%src%%'' befindet:
 +
 +<code>
 +cmake_minimum_required(VERSION 3.18)
 +project(beispiel)
 +
 +# zu erzeugende Ziele + deren Quellen:
 +add_executable(programm src/quelltext.cpp)
 +</code>
 +Zum Übersetzen sollte ein getrenntes Verzeichnis ''%%build%%'' für die von CMake erzeugten Dateien angelegt werden. Dort werden das Projekt konfiguriert, Programm(e) übersetzt und bei Erfolg ausgeführt:
 +
 +<code bash>
 +mkdir build                        # Verzeichnis anlegen  
 +cd build                           # und hinein wechseln
 +cmake -G "MinGW Makefiles" ..      # Projekt erzeugen: hier Makefiles
 +cmake --build .                    # Projekt übersetzen  
 +programm                           # ausführen
 +</code>
 +Der Befehl ''%%cmake ..%%'' genügt für den von CMake voreingestellten Compiler. Soll ein anderes Build-System zum Einsatz kommen, wird als Option ''%%-G "Name des Generators"%%'' angegeben. ''%%cmake --help%%'' liefert eine Liste verfügbarer Generatoren. Falls die Erzeugung des Projektes scheitert, einfach ''%%build%%''-Verzeichnis komplett löschen und von vorn beginnen.
 +
 +Für spätere Änderungen am Projekt entfällt die Angabe des Generators:
 +
 +<code bash>
 +cmake ..                           # bei Änderungen an CMakeLists.txt
 +cmake --build .                    # bei Änderungen am Quelltext
 +cmake --build . --target programm  # wenn nur ein bestimmtes Ziel erreicht werden soll
 +</code>
 +Als Targets dienen auch ''%%all%%'' (baue alle Ziele), ''%%clean%%'' (übersetzte Dateien entfernen), ''%%help%%'' (zeigt Liste erreichbarer Ziele an) oder ''%%test%%'' ([[doctest|Tests]] mit [[doctest#CTest]] durchführen, sofern definiert).
 +
 +===== C++-Version vorgeben =====
 +
 +Den Sprachstandard kann man vor allen Zielen global festlegen (C++20 kennt CMake ab Version 3.12, C++17 ab 3.8):
 +
 +<code>
 +set(CMAKE_CXX_STANDARD 20)
 +set(CMAKE_CXX_STANDARD_REQUIRED ON)
 +set(CMAKE_CXX_EXTENSIONS OFF)
 +</code>
 +Bei komplexeren Projekten empfiehlt sich die Angabe für jedes Ziel separat
 +
 +<code>
 +set_target_properties(myTarget
 +    PROPERTIES
 +        CXX_STANDARD 20
 +        CXX_STANDARD_REQUIRED ON
 +        CXX_EXTENSIONS OFF
 +)
 +</code>
 +oder über erforderliche Compiler-Merkmale (siehe Dokumentation zu [[https://cmake.org/cmake/help/v3.18/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html|CMAKE_CXX_KNOWN_FEATURES]]):
 +
 +<code>
 +target_compile_features(myTarget PRIVATE cxx_std_20)
 +</code>
 +===== Mehrere Dateien =====
 +
 +Mehrere Quellen werden bei der Festlegung des Ziels aufgeführt oder später ergänzt:
 +
 +<code>
 +add_executable(programm quelle1.cpp quelle2.cpp)
 +target_sources(programm zusatzquelle1.cpp zusatzquelle2.cpp)
 +</code>
 +Verzeichnisse wie ''%%src%%'' und ''%%include%%'' (relativ zu ''%%CMakeLists.txt%%'') werden mit diesen Befehlen gefunden:
 +
 +<code>
 +target_include_directories(programm include)
 +target_source_directories(programm src)
 +</code>
 +===== Bibliotheken erstellen und einbinden =====
 +
 +Auch Bibliotheken sind Ziele in CMake:
 +
 +<code>
 +add_library(libname libsrcfiles)          # Bibliothek erzeugen
 +target_link_libraries(programm libname)   # Bibliothek einbinden
 +</code>
 +===== Unterprojekte bauen =====
 +
 +Unterverzeichnisse mit eigener ''%%CMakeLists.txt%%'' erlauben komplexe Projekte mit rekursiver Struktur:
 +
 +<code>
 +add_subdirectory(dirname)
 +</code>
  
lernen/cmake.txt · Zuletzt geändert: 2020-08-23 20:03 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki