2011-09-13 5 views
6

tengo una sección de código que se activa de forma condicional dependiendo de una #define, así:¿Cómo puedo definir una variable cuando llamo a CMake, para que qtcreator sepa que está definido?

#ifdef VARIABLE 
    code.function(); 
#endif 

El guión cmake tiene un comando de 'opciones' que establece la variable de la siguiente manera:

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") 

Estoy usando cmake para construir el proyecto y qtcreator como IDE. Mi problema es que qtcreator cree que VARIABLE no está definido, por lo que mi código no está resaltado, pero cuando lo construyo en una consola, se define VARIABLE. Entonces, ¿qué parámetros debo pasar a qtcreator para ejecutar cmake, para que sepa que VARIABLE está definido y resalta mi código? ¿Hay alguna forma de hacer esto?

Ps: Solo uso qtcreator para editar archivos, la parte de compilación se realiza mediante comandos de consola.

Respuesta

5

Otra alternativa sería el uso de un archivo de cabecera configurado, e incluir sólo donde se necesita la definición:

# 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}) 

y

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

y finalmente

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

I no use QtCreator regularmente, así que no sé si esta técnica funciona en términos de su sintaxis destacando, pero supongo que lo haría, ya que deben leer los archivos de encabezado para hacer un trabajo adecuado ...

+0

Más complejidad de la que me gustaría simplemente para corregir el resaltado de sintaxis de qtcreator, pero funciona. Además, aprendí cómo configurar archivos de cabecera usando cmake, así que creo que fue una gran respuesta. Además, gracias por hacer mi pregunta más clara. – Salsa

+0

¡De nada! En general, creo que es mejor usar un archivo de encabezado que solo esté incluido cuando sea necesario para hacer algo como esto. De esta forma, solo los archivos que se deben reconstruir se reconstruirán en una reconstrucción incremental después de cambiar el valor de VARIABLE en CMake ... La segunda mejor manera es usar add_definitions() en el archivo CMakeLists de nivel superior para que todos los archivos compilados obtengan definición. Pero luego si cambia el valor en CMake, esto lleva a una reconstrucción completa. – DLRdave

3

Eche un vistazo a add_definitions(). Se añade un preprocesador-definir al compilador y se puede utilizar como cualquier #define ordinaria:

add_definitions(-DVARIABLE) 

Sin embargo ... no estoy seguro de si esto hará que QtCreator recogerlo como una 'variable conocida'.

+0

Ya había intentado algo similar, simplemente no usando add_definitions. De todos modos, no funcionó. Parece que qtcreator ignora las definiciones del compilador. – Salsa

+0

Por lo que vale: en Qt Creator 4.1.0, el uso de "add_definitions (-DVARIABLE)" como sugiere Andre parece tener un efecto sobre la forma en que Qt Creator muestra el preprocesador define. –

1

También puede usar el archivo project_name.config. Se usa específicamente para su necesidad. Puede agregar definiciones que solo QtCreator interpreta para resaltar y completar automáticamente.

Este archivo normalmente se encuentra en la carpeta raíz de su proyecto.

Cuestiones relacionadas