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?

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.


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.


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 ;.


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


4

// CMakeLists.txt: release

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

// CMakeLists.txt: Debug

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.