2011-09-13 12 views
6

ho una sezione di codice che viene condizionato attivato in funzione di un # define, come questo:Come definisco una variabile quando chiamo CMake, in modo che qtcreator sappia che è definito?

#ifdef VARIABLE 
    code.function(); 
#endif 

Lo script CMake ha un comando 'Opzioni' che imposta la variabile in questo modo:

option(VARIABLE "Want to use VARIABLE?" ON) 

if(VARIABLE) 
    message(STATUS "VARIABLE") 
    set(VARIABLE_FLAG "-DVARIABLE") 
endif() 

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${VARIABLE_FLAG} -Wall") 

Sto usando cmake per costruire il progetto e qtcreator come IDE. Il mio problema è che qtcreator pensa che VARIABLE non sia definito quindi il mio codice non è evidenziato, ma quando lo costruisco su una console, VARIABLE è definito. Quindi, quali parametri dovrei passare a qtcreator per eseguire cmake, in modo che sappia che VARIABLE è definito ed evidenzia il mio codice? C'è un modo per fare questo?

Ps: uso solo qtcreator per modificare i file, la parte di compilazione viene eseguita tramite i comandi della console.

risposta

5

Un'altra alternativa sarebbe quella di utilizzare un file di intestazione configurato, e comprendono solo dove è necessario la definizione:

# in CMakeLists.txt 
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/my_defs.h.in 
    ${CMAKE_CURRENT_BINARY_DIR}/my_defs.h 
) 

include_directories(${CMAKE_CURRENT_BINARY_DIR}) 

e

// in my_defs.h.in 
#cmakedefine VARIABLE 
    // configure_file converts #cmakedefine of a named CMake variable 
    // into a C++ #define of a C++ pre-processor symbol 

e infine

// in various C++ source or header files, but only as needed: 
#include "my_defs.h" 
#ifdef VARIABLE 
    doSome_VARIABLE_SpecificStuff(); 
#endif 

I non usare regolarmente QtCreator, quindi non so se questa tecnica funzioni in termini di sintassi evidenziando, ma suppongo che sarebbe, dal momento che devono leggere i file di intestazione per fare un lavoro corretto di esso ...

+0

Più complessità di quanto mi piacerebbe solo per correggere l'evidenziazione della sintassi di qtcreator, ma funziona. Inoltre, ho imparato come configurare i file header usando cmake, quindi penso che sia stata una grande risposta. Inoltre, grazie per aver reso la mia domanda più chiara. – Salsa

+0

Prego! In generale, penso che sia meglio usare un file di intestazione che è incluso solo dove necessario per fare qualcosa di simile. In questo modo, solo i file che devono essere ricostruiti verranno ricostruiti in una ricostruzione incrementale dopo aver modificato il valore di VARIABLE in CMake ... Il secondo modo migliore è utilizzare add_definitions() nel file CMakeLists di livello superiore in modo che tutti i file compilati ottengano il definizione. Ma se si modifica il valore in CMake, si ottiene una ricostruzione completa. – DLRdave

3

Dai uno sguardo allo add_definitions(). Si aggiunge un preprocessore definire al compilatore e può essere utilizzato come un qualsiasi normale #define:

add_definitions(-DVARIABLE) 

Comunque ... io non sono sicuro se questo renderà QtCreator raccoglierla come 'variabile conosciuta'.

+0

Avevo già provato qualcosa di simile, semplicemente non usando add_definitions. Ad ogni modo, non ha funzionato. Sembra che qtcreator ignori le definizioni del compilatore. – Salsa

+0

Per quello che vale: su Qt Creator 4.1.0, l'uso di "add_definitions (-DVARIABLE)" come suggerito da Andre sembra avere un effetto sul modo in cui Qt Creator visualizza il preprocessore. –

1

È anche possibile utilizzare il file project_name.config. È specificamente utilizzato per le tue necessità. È possibile aggiungere definizioni che sono interpretate solo da QtCreator per l'evidenziazione e il completamento automatico.

Questo file si trova normalmente nella cartella principale del progetto.

Problemi correlati