Debug vs Release in CMake

434

In einem von GCC kompilierten Projekt

  • Wie führe ich CMake für jeden Zieltyp aus (Debug / Release)?
  • Wie spezifiziere ich Debug- und Release-C / C ++ - Flags mit CMake?
  • Wie drücke ich aus, dass die ausführbare Hauptdatei mit g++und eine verschachtelte Bibliothek mit kompiliert wird gcc?
Cartesius00
quelle

Antworten:

656

Bei CMake wird im Allgemeinen empfohlen, einen "Out-of-Source" -Build durchzuführen . Erstellen Sie Ihre CMakeLists.txtim Stammverzeichnis Ihres Projekts. Dann von der Wurzel Ihres Projekts:

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

Und für Debug(wieder von der Wurzel Ihres Projekts):

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

Release/ Debugfügt die entsprechenden Flags für Ihren Compiler hinzu. Es gibt auch RelWithDebInfound MinSizeRelBuild-Konfigurationen.


Sie können durch die Angabe einer auf die Flags ändern / hinzufügen Toolchain - Datei , in der Sie hinzufügen können , CMAKE_C_FLAGS_DEBUGund CMAKE_C_FLAGS_RELEASEVariablen, zum Beispiel:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")

Weitere Informationen finden Sie unter CMAKE_BUILD_TYPE .


Was Ihre dritte Frage betrifft, bin ich mir nicht sicher, was Sie genau fragen. CMake sollte den für Ihre verschiedenen Quelldateien geeigneten Compiler automatisch erkennen und verwenden.

kb1ooo
quelle
3
Sie können cmake -i ..stattdessen auch eine ausführen, damit cmake interaktiv ausgeführt wird und Sie gefragt werden, welche Art von Build Sie möchten (Keine, Release, Debug, MinSizeRel, RelWithDebInfo).
Thiagowfx
5
Die -iOption @thiagowfx führt zu dieser Fehlermeldung : The "cmake -i" wizard mode is no longer supported.. Ich benutze cmake 3.7.1
Philipp Claßen
3
Schöne Beobachtung. Es scheint, dass es seit der Version veraltet war 3.0.0. Referenz .
Thiagowfx
7
Dies ist KEIN Out-of-Source-Build, wenn Sie ein Unterverzeichnis erstellen! Es wird empfohlen, das Build-Verzeichnis außerhalb / über dem Quellverzeichnis zu erstellen.
Victor Lamoine
Beachten Sie, dass CMAKE_BUILD_TYPEcmake , wenn es nicht festgelegt ist, keinen Standard-Build-Typ auswählt, sodass die generierte Compiler-Befehlszeile keiner Build-Konfiguration entspricht.
David
22

Informationen zu Debug- / Release-Flags finden Sie in der CMAKE_BUILD_TYPEVariablen (Sie übergeben sie als cmake -DCMAKE_BUILD_TYPE=value). Es braucht Werte wie Release,Debug usw.

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools

cmake verwendet die Erweiterung, um den Compiler auszuwählen. Benennen Sie also einfach Ihre Dateien .c.

Sie können dies mit verschiedenen Einstellungen überschreiben:

Zum Beispiel:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

Würde .c-Dateien mit g ++ kompilieren. Der obige Link zeigt auch, wie Sie einen bestimmten Compiler für C / C ++ auswählen.

Duncan
quelle
15

Anstatt die CMAKE_CXX_FLAGSZeichenfolgen direkt zu manipulieren (was string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")übrigens besser möglich wäre), können Sie Folgendes verwenden add_compiler_options:

add_compile_options(
  "-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
  "$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)

Dies würde die angegebenen Warnungen zu allen Build-Typen hinzufügen, aber nur die angegebenen Debugging-Flags zum DEBUGBuild. Beachten Sie, dass Kompilierungsoptionen als CMake-Liste gespeichert werden, bei der es sich lediglich um eine Zeichenfolge handelt, die ihre Elemente durch Semikolons trennt ;.

Sebastian
quelle
2
Wird nicht list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")ein Semikolon hinzufügen , bevor -g3 den Befehl beendet und einen neuen Befehl -g3 beginnen , die sicherlich fehl?
Cburn11
Sie haben Recht, es CMAKE_CXX_FLAGShandelt sich nicht um eine cmake-Liste, sondern um eine Zeichenfolge von durch Leerzeichen getrennten Befehlszeilenflags. Ich finde dieses Verhalten inkonsistent ...
Sebastian
add_compile_options () ist ordentlich. Es wird durch add_link_options () ergänzt, wenn Sie dem Linker auch Optionen hinzufügen müssen, z. B. -fsanitize = address.
Bowie Owens
1
Ist dies auch 2020 / cmake 3.17 noch der richtige Weg? Diese letzte Zeile sieht böse aus
Jay
8

Wenn Sie eine andere Konfiguration erstellen möchten, ohne sie neu zu generieren, können Sie cmake --build {$PWD} --config <cfg>für Tools mit mehreren Konfigurationen auch Folgendes auswählen:<cfg> ex. Debug, Release, MinSizeRel, RelWithDebInfo

https://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir

Russel Waters
quelle
Ich habe versucht, mit --configOption ohne Ergebnis zu spielen . Es wirkt sich nicht auf $<CONFIG>Variablen aus -DCMAKE_BUILD_TYPE=.
Loshad Vtapkah
4

// CMakeLists.txt: release

set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)

// CMakeLists.txt: Debug

set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)
Segelfisch009
quelle
9
Ich verstehe nicht, warum dies abgestimmt wird, es ist echter Code, der in der Produktion verwendet wird, übrigens ist es mir egal.
Sailfish009
5
Vielleicht, weil laut CMake docs CMAKE_CONFIGURATION_TYPESdie möglichen Werte für enthalten CMAKE_BUILD_TYPE. Sie sollten also Letzteres einstellen, wie die anderen Antworten vermuten lassen. Vielleicht funktioniert Ihre Lösung, weil sie die Auswahlmöglichkeiten auf die beschränkt, die Sie haben möchten.
bjhend
2
Upvote, weil das funktionieren wird. Ich liebe CMake, aber es gibt Macken und manchmal muss man einen großen Hammer verwenden, damit die Dinge funktionieren. Ich habe einige Projekte, die aus dem einen oder anderen Grund das Befehlszeilenflag ablehnen.
cory.todd
Hier sind einige zusätzliche Informationen darüber, warum die Einstellung möglicherweise nicht funktioniert: stackoverflow.com/a/24470998/3196753
tresf