Debug vs Release in CMake


437

In un progetto compilato GCC,

  • Come posso eseguire CMake per ciascun tipo di destinazione (debug / versione)?
  • Come posso specificare il debug e rilasciare i flag C / C ++ usando CMake?
  • Come posso esprimere che l'eseguibile principale verrà compilato con g++una libreria nidificata con gcc?

Risposte:


660

Con CMake, si consiglia generalmente di creare una build "out of source" . Crea il tuo CMakeLists.txtnella radice del tuo progetto. Quindi dalla radice del tuo progetto:

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

E per Debug(sempre dalla radice del tuo progetto):

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

Release/ Debugaggiungerà i flag appropriati per il tuo compilatore. Ci sono anche RelWithDebInfoe MinSizeRelcostruire configurazioni.


È possibile modificare / aggiungere ai flag specificando un file di toolchain in cui è possibile aggiungere CMAKE_C_FLAGS_DEBUGe CMAKE_C_FLAGS_RELEASEvariabili, ad esempio:

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

Vedi CMAKE_BUILD_TYPE per maggiori dettagli.


Per quanto riguarda la tua terza domanda, non sono sicuro di quello che stai chiedendo esattamente. CMake dovrebbe rilevare e utilizzare automaticamente il compilatore appropriato per i diversi file di origine.


3
Puoi anche fare un cmake -i ..invece, quindi cmake verrà eseguito in modo interattivo, chiedendoti quale tipo di build desideri (None, Release, Debug, MinSizeRel, RelWithDebInfo).
thiagowfx,

5
@thiagowfx -irisultati di opzione in questo messaggio di errore: The "cmake -i" wizard mode is no longer supported.. Sto usando cmake 3.7.1
Philipp Claßen il

3
Bella osservazione. Sembra che sia stato deprecato dalla versione 3.0.0. Riferimento .
thiagowfx,

7
Questa NON è una build fuori sorgente se stai creando una sottodirectory! Si consiglia di creare la directory di build all'esterno / sopra la directory di origine.
Victor Lamoine,

Nota che se CMAKE_BUILD_TYPEnon è impostato, cmake non sceglierà alcun tipo di build predefinito, quindi la riga di comando del compilatore generata non corrisponderà a nessuna configurazione di build.
David,

23

Per i flag di debug / rilascio, vedere la CMAKE_BUILD_TYPEvariabile (la si passa come cmake -DCMAKE_BUILD_TYPE=value). Ci vuole valori come Release, Debugecc

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

cmake usa l'estensione per scegliere il compilatore, quindi dai un nome ai tuoi file .c.

Puoi ignorarlo con varie impostazioni:

Per esempio:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

Compilerebbe i file .c con g ++. Il link sopra mostra anche come selezionare un compilatore specifico per C / C ++.


16

Invece di manipolare CMAKE_CXX_FLAGSdirettamente le stringhe (cosa che potrebbe essere fatta più bene usando string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")btw), puoi usare add_compiler_options:

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

Ciò aggiungerebbe gli avvisi specificati a tutti i tipi di build, ma solo i flag di debug forniti alla DEBUGbuild. Nota che le opzioni di compilazione sono memorizzate come un elenco CMake, che è solo una stringa che separa i suoi elementi con punti e virgola ;.


2
Non list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")aggiungere un punto e virgola prima che -g3 abbia terminato il comando e avviato un nuovo comando -g3 che sicuramente fallirà?
cburn11,

Hai ragione nonCMAKE_CXX_FLAGS è un elenco di cmake ma una stringa di flag della riga di comando separati da spazio. Trovo che quel comportamento sia incoerente ...
sebastian

add_compile_options () è pulito. È integrato da add_link_options () per quando è necessario aggiungere anche opzioni al linker come -fsanitize = address.
Bowie Owens,

1
È ancora questo il modo appropriato nel 2020 / cmake 3.17? L'ultima riga sembra brutta
Jay,


5

// CMakeLists.txt: release

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

// CMakeLists.txt: debug

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

10
non capisco perché questo sia stato votato, è un vero codice usato nella produzione, tra l'altro non mi interessa.
sailfish009

5
Forse perché secondo i documenti di CMake CMAKE_CONFIGURATION_TYPEScontiene i possibili valori per CMAKE_BUILD_TYPE. Quindi dovresti impostare quest'ultimo come suggeriscono le altre risposte. Forse la tua soluzione funziona perché limita le possibili scelte a quella che vorresti avere.
Bjhend,

2
Votazione perché funzionerà. Mi piace un po 'di CMake ma ci sono delle stranezze e a volte devi usare un grosso martello per far funzionare le cose. Ho alcuni progetti che per un motivo o per l'altro rifiuteranno il flag della riga di comando.
cory.todd,

Ecco alcune informazioni aggiuntive sul perché l'impostazione non può funzionare: stackoverflow.com/a/24470998/3196753
tresf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.