Respostas:
Durante muito tempo, o CMake teve o add_definitions
comando para esse fim. No entanto, recentemente o comando foi substituído por uma abordagem mais refinada (comandos separados para definições de compilação, incluem diretórios e opções do compilador).
Um exemplo usando as novas add_compile_definitions :
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)
Ou:
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)
A parte boa disso é que ele contorna as artimanhas surradas que o CMake possui para add_definitions
. O CMake é um sistema tão surrado, mas eles finalmente estão encontrando alguma sanidade.
Encontre mais explicações sobre quais comandos usar para sinalizadores de compilador aqui: https://cmake.org/cmake/help/latest/command/add_definitions.html
Da mesma forma, você pode fazer isso por alvo, conforme explicado na resposta de Jim Hunziker.
add_compile_definitions
lança CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
. Teve que usar em seu add_compile_options(-D <your-def>)
lugar.
cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'
(não testado)
https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions
e começar a alterar o número da versão para baixo até a página desaparecer. Essa seria a versão em que ainda não existe. Na próxima jogada, você pode ir para a Whats new
seção para encontrar um novo comando ou recurso. Então não é tão difícil.
Para fazer isso para um destino específico, você pode fazer o seguinte:
target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)
Você deve fazer isso se tiver mais de um alvo que está construindo e não quiser que todos usem os mesmos sinalizadores. Consulte também a documentação oficial em target_compile_definitions .
target_compile_definitions(my_target PRIVATE FOO=1)
diferença set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)
?
target_compile_definitions
define o valor para WHOLE executable / library, onde como 'set_source_files_properties` define o valor apenas para o arquivo especificado. O último comando permite que os arquivos sejam compilados usando um idioma diferente; isto é: set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c
. Observe que -x objective-c
aqui está um sinalizador específico para GCC / Clang.
A outra solução proposta nesta página é útil em algumas versões do Cmake <
3.3.2
. Aqui a solução para a versão que estou usando (ou seja,3.3.2
). Verifique a versão do seu Cmake usando$ cmake --version
e escolha a solução mais adequada às suas necessidades. A documentação do cmake pode ser encontrada na página oficial.
Com o CMake versão 3.3.2, para criar
#define foo
Eu precisava usar:
add_definitions(-Dfoo) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
e, para ter uma definição de macro de pré-processador como esta:
#define foo=5
a linha é assim modificada:
add_definitions(-Dfoo=5) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
add_definitions()
ou target_compile_definitions()
. O comando mais moderno add_compile_definitions()
,, não foi adicionado até o CMake 3.12. @ Leos313