Respuestas:
Durante mucho tiempo, CMake tuvo el add_definitions
comando para este propósito. Sin embargo, recientemente el comando ha sido reemplazado por un enfoque más detallado (comandos separados para compilar definiciones, incluir directorios y opciones de compilación).
Un ejemplo usando las nuevas add_compile_definitions :
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)
O:
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)
Lo bueno de esto es que evita el truco en mal estado que CMake tiene establecido add_definitions
. CMake es un sistema tan lamentable, pero finalmente están encontrando cierta cordura.
Encuentre más explicaciones sobre qué comandos usar para los indicadores del compilador aquí: https://cmake.org/cmake/help/latest/command/add_definitions.html
Del mismo modo, puede hacer esto por objetivo como se explica en la respuesta de Jim Hunziker.
add_compile_definitions
tiros CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
. Tuve que usar add_compile_options(-D <your-def>)
en su lugar.
cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'
https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions
y comenzar a cambiar el número de versión hacia abajo hasta que desaparezca la página. Esa sería la versión donde aún no existe. En el siguiente movimiento, puede ir a la Whats new
sección para encontrar un nuevo comando o función. Entonces no es tan difícil.
Para hacer esto para un objetivo específico, puede hacer lo siguiente:
target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)
Debes hacer esto si tienes más de un objetivo que estás construyendo y no quieres que todos usen las mismas banderas. Consulte también la documentación oficial sobre target_compile_definitions .
target_compile_definitions(my_target PRIVATE FOO=1)
diferente de set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)
?
target_compile_definitions
establece el valor para TODO el ejecutable / biblioteca, donde como 'set_source_files_properties` establece el valor solo para el archivo especificado. El último comando permite que los archivos se compilen usando un idioma diferente; es decir: set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c
. Tenga en cuenta que -x objective-c
aquí hay una bandera específica para GCC / Clang.
La otra solución propuesta en esta página son útiles en algunas versiones de Cmake <
3.3.2
. Aquí la solución para la versión que estoy usando (es decir,3.3.2
). Verifique la versión de su Cmake usando$ cmake --version
y elija la solución que se ajuste a sus necesidades. La documentación de cmake se puede encontrar en la página oficial.
Con CMake versión 3.3.2, para crear
#define foo
Necesitaba usar:
add_definitions(-Dfoo) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
y, para tener una definición de macro de preprocesador como esta otra:
#define foo=5
la línea se modifica así:
add_definitions(-Dfoo=5) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
add_definitions()
o target_compile_definitions()
. El comando más moderno add_compile_definitions()
no se agregó hasta CMake 3.12. @ Leos313