Viele der Antworten hier sind veraltet/schlecht. Deshalb werde ich versuchen, sie besser zu beantworten. Zugegeben, ich beantworte diese Frage im Jahr 2020, es ist also zu erwarten, dass sich die Dinge ändern werden.
Wie führe ich CMake für jeden Zieltyp (Debug/Release) aus?
Zunächst einmal werden Debug/Release in cmake als Konfigurationen bezeichnet (Erbsenzähler).
Wenn Sie einen einzelnen Konfigurationsgenerator (Ninja/Unix-Makefiles) verwenden, müssen Sie die CMAKE_BUILD_TYPE .
Zum Beispiel so:
# Configure the build
cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Debug
# Actually build the binaries
cmake --build build/
# Configure a release build
cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release
# Build release binaries
cmake --build build/
Bei Generatoren mit mehreren Konfigurationen ist die Situation etwas anders (Ninja Multi-Config, Visual Studio)
# Configure the build
cmake -S . -B build
# Build debug binaries
cmake --build build --config Debug
# Build release binaries
cmake --build build --config Release
Wenn Sie sich fragen, warum das notwendig ist, liegt das daran, dass cmake kein Build-System ist. Es ist ein Meta-Build-System (IE ein Build-System, das Build-Systeme baut). Dies ist im Grunde das Ergebnis der Handhabung von Build-Systemen, die mehrere Konfigurationen in einem Build unterstützen. Wenn Sie ein tieferes Verständnis wünschen, empfehle ich Ihnen, ein wenig über cmake in Craig Scotts Buch "Professional CMake: A Practical Guide" zu lesen.
Wie kann ich mit CMake Debug- und Release-Flags für C/C++ angeben?
Die moderne Praxis besteht darin, Ziele und Eigenschaften zu verwenden.
Hier ist ein Beispiel:
add_library(foobar)
# Add this compile definition for debug builds, this same logic works for
# target_compile_options, target_link_options, etc.
target_compile_definitions(foobar PRIVATE
$<$<CONFIG:Debug>:
FOOBAR_DEBUG=1
>
)
HINWEIS: Ich verwende Generatorausdrücke, um die Konfiguration festzulegen! Die Verwendung von CMAKE_BUILD_TYPE führt zu fehlerhaften Builds für jeden Multikonfigurationsgenerator!
Außerdem muss man manchmal Dinge global und nicht nur für ein bestimmtes Ziel festlegen. Verwenden Sie add_compile_definitions, add_compile_options, etc. Diese Funktionen unterstützen Generatorausdrücke. Benutzen Sie nicht das alte cmake, wenn Sie nicht müssen (dieser Pfad ist ein Land der Albträume)
Wie drücke ich aus, dass die ausführbare Hauptdatei mit g++ und eine verschachtelte Bibliothek mit gcc kompiliert werden soll?
Ihre letzte Frage ergibt wirklich keinen Sinn.