Imposta le opzioni CFLAGS e CXXFLAGS utilizzando CMake


90

Voglio solo eseguire il debug di un codice in esecuzione su Linux e ho bisogno di una build di debug ( -O0 -ggdb). Quindi ho aggiunto queste cose al mio CMakeLists.txt:

set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")

Quando ho provato a compilare, sono diventato prolisso usando make VERBOSE=1 E ho osservato l'output, in questo modo

... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor 
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W 
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS 
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics 
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2** 
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...

Apparentemente il codice è stato compilato "-g -O2"e questo non è quello che voglio. Come posso forzarne l'uso "-O0 -ggdb"solo?


1
Se vuoi una build debuggabile, esegui una configurazione di debug dalla riga di comando. "cmake -DCMAKE_BUILD_TYPE = Debug". La build risultante avrà i flag di debug attivi per il sistema di build specificato. Nessun motivo per modificare il file cmake stesso. Puoi anche inviare il valore CMAKE_C_FLAGS con un altro argomento -D.
Atifm

Risposte:


84

Devi impostare i flag dopo il projectcomando nel tuo CMakeLists.txt.

Inoltre, se stai chiamando include(${QT_USE_FILE})o add_definitions(${QT_DEFINITIONS}), dovresti includere questi setcomandi dopo quelli Qt poiché questi aggiungerebbero ulteriori flag. Se è così, forse vuoi solo aggiungere i tuoi flag a quelli Qt, quindi cambia ad es

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")

Ho messo quei flag dopo il comando del progetto. Ma l'output è lo stesso.
Majie

Ho appena notato la QT_NO_EXCEPTIONSnelle tue bandiere, quindi ho esteso un po 'la mia risposta. Immagino che ${QT_DEFINITIONS}stia aggiungendo il file -g -O2.
Fraser

1
Sì, è questo. Mettere questi setcomandi dopo quelli Qt risolve il problema. Grazie mille.
Majie

17

La soluzione più semplice che funziona bene per me è questa:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake li aggiungerà ai flag di tutte le configurazioni. Assicurati solo di svuotare la cache di CMake.


3
Impostare i flag nell'ambiente in questo modo è l'unico modo per farlo senza modificare il tuo CMakeLists.txt. Si noti che il valore dell'ambiente viene letto solo alla prima configurazione e quindi inserito nella cache, quindi se si desidera modificarlo è necessario svuotare la cache CMake ed eseguire nuovamente il passaggio di configurazione con i nuovi valori nel file env. Documenti: cmake.org/cmake/help/latest/envvar/CFLAGS.html cmake.org/cmake/help/latest/envvar/CXXFLAGS.html
bleater

3
Non è "il più semplice", è l'unico modo giusto per farlo.
Slava

Cattura minore, se il generatore sta configurando un flag specifico per un tipo di build specifico (ad esempio in CMAKE_CXX_FLAGS_DEBUG ecc.), Includerlo in CXXFLAGS(e quindi iniettarlo in CMAKE_CXX_FLAGS) non è effettivamente sufficiente per passare l'opzione al compilatore. La configurazione per tipo di build ha la precedenza sull'input dell'utente.
Ext3h

16

È necessario modificare i FLAG predefiniti di cmake C / CXX.

Secondo CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} mettere in quello principale CMakeLists.txtdi:

Per C

set(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")

Per C ++

set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")

Ciò sovrascriverà i valori definiti in CMakeCache.txt


che sovrascrive i tuoi flag cmake che sono correnti. quindi interrompe il debug a meno che non si aggiunga il flag -g (gcc)
activedecay

C'è la stessa idea usando la sintassi "Modern Cmake"?
Sandburg

6

Su sistemi Unix, per diversi progetti, ho aggiunto queste righe nel CMakeLists.txt e si stava compilando con successo perché base ( / usr / include ) e include locali ( / usr / local / include ) vanno in directory separate:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")

Aggiunge la directory corretta, inclusi i percorsi per i flag del compilatore C e C ++ e il percorso della directory corretto per i flag del linker.

Nota: il compilatore C ++ (c ++) non supporta -L, quindi dobbiamo usare CMAKE_EXE_LINKER_FLAGS


3
Non è meglio usare al include_directoriesposto della -Ibandiera?
Tejas Kale

Grazie mille. Stavo inserendo i flag del mio linker CMAKE_CXX_FLAGS, il che li ha fatti ignorare. Ora che li ho inseriti in CMAKE_EXE_LINKER_FLAGSbase alla tua risposta, funzionano perfettamente.
Nahiyan
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.