2012-04-10 11 views
52

Voglio solo eseguire il debug di alcuni codici in esecuzione su Linux e ho bisogno di una build di debug (-O0 -ggdb). Così ho aggiunto queste cose al mio CMakeLists.txt:cmake CFLAGS CXXFLAGS modifica

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 ho acceso verbose sull'uso make VERBOSE=1 E ho osservato l'uscita, come questo

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

A quanto pare il codice viene compilato con "-g -O2" e questo non è quello che voglio. Come posso costringerlo a usare solo "-O0 -ggdb"?

+1

Se si desidera una compilazione di debug, è sufficiente eseguire una configurazione di debug nella riga di comando. "cmake -DCMAKE_BUILD_TYPE = Debug". La build risultante avrà i flag di debug per il dato sistema di build. Nessun motivo per modificare il file cmake stesso. Puoi anche inviare il valore CMAKE_C_FLAGS con un altro argomento -D. – Atifm

risposta

47

È necessario impostare le bandiere dopo il il comando project in CMakeLists.txt.

Inoltre, se si sta chiamando include(${QT_USE_FILE}) o add_definitions(${QT_DEFINITIONS}), è necessario includere questi comandi set dopo quelli Qt poiché questi potrebbero aggiungere ulteriori flag. Se questo è il caso, forse vuoi semplicemente aggiungere i tuoi flag ai Qt, quindi passa ad es.

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

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

+0

Ho appena notato "QT_NO_EXCEPTIONS" nelle tue bandiere, quindi ho esteso la mia risposta un po '. Suppongo che '$ {QT_DEFINITIONS}' aggiunga '-g -O2'. – Fraser

+1

Sì, è così. Mettere quei comandi 'set' dopo che i Qt risolvono il problema. Grazie mille. – majie

9

È necessario modificare le flag di default Cmake C/CXX.

Secondo CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} messo nella principale CMakeLists.txt uno di:

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ò sovrascrivere i valori definiti in CMakeCache.txt

2

Sui sistemi Unix, per diversi progetti, ho aggiunto queste righe nella CMakeLists.txt ed è stato la compilazione di successo perché di base (/usr/include) e locali include (/usr/local/include) andare 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") 

che aggiunge la directory corretta, inclusi i percorsi per il percorso della directory corretta per le bandiere linker il flag di compilazione C e C++ e.

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

3

La soluzione più semplice lavorare bene per me è questa:

export CFLAGS=-ggdb 
export CXXFLAGS=-ggdb 

CMake aggiungerà loro a tutte le bandiere di configurazioni.