Comment définir une variable de préprocesseur via CMake?
Le code équivalent serait #define foo
.
la source
Comment définir une variable de préprocesseur via CMake?
Le code équivalent serait #define foo
.
Pendant longtemps, CMake avait la add_definitions
commande à cet effet. Cependant, récemment, la commande a été remplacée par une approche plus fine (commandes distinctes pour compiler les définitions, inclure les répertoires et les options du compilateur).
Un exemple utilisant les nouvelles 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)
La bonne partie à ce sujet est qu'il contourne la supercherie minable que CMake a mise en place add_definitions
. CMake est un tel système minable, mais ils trouvent enfin un peu de raison.
Trouvez plus d'explications sur les commandes à utiliser pour les drapeaux du compilateur ici: https://cmake.org/cmake/help/latest/command/add_definitions.html
De même, vous pouvez faire cela par cible comme expliqué dans la réponse de Jim Hunziker.
add_compile_definitions
jetteCMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
. J'ai dû utiliser à laadd_compile_options(-D <your-def>)
place.cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'
(non testé)https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions
et commencer à changer le numéro de version jusqu'à ce que la page disparaisse. Ce serait la version là où elle n'existe pas encore. Dans le prochain mouvement, vous pouvez aller à laWhats new
section pour trouver une nouvelle commande ou fonctionnalité. Donc ce n'est pas si difficile.Pour ce faire, pour une cible spécifique, vous pouvez effectuer les opérations suivantes:
Vous devriez le faire si vous avez plusieurs cibles que vous construisez et que vous ne voulez pas qu'elles utilisent toutes les mêmes indicateurs. Voir également la documentation officielle sur target_compile_definitions .
la source
target_compile_definitions(my_target PRIVATE FOO=1)
différent deset_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)
?target_compile_definitions
définit la valeur de l'exécutable / bibliothèque WHOLE, où as 'set_source_files_properties` définit la valeur uniquement pour le fichier spécifié. La dernière commande permet de compiler des fichiers dans une autre langue; à savoir:set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c
. Notez que-x objective-c
voici un drapeau spécifique à GCC / Clang.Avec CMake version 3.3.2, afin de créer
J'avais besoin d'utiliser:
et, afin d'avoir une définition de macro de préprocesseur comme celle-ci:
la ligne est ainsi modifiée:
la source
add_definitions()
outarget_compile_definitions()
. La commande plus moderne,,add_compile_definitions()
n'a pas été ajoutée avant CMake 3.12. @ Leos313