Réponses:
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
jette CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
. J'ai dû utiliser à la add_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 à la Whats 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:
target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)
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 .
target_compile_definitions(my_target PRIVATE FOO=1)
différent de set_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.
Les autres solutions proposées sur cette page sont utiles sur certaines versions de Cmake <
3.3.2
. Voici la solution pour la version que j'utilise (ie,3.3.2
). Vérifiez la version de votre Cmake en utilisant$ cmake --version
et choisissez la solution qui correspond à vos besoins. La documentation de cmake se trouve sur la page officielle.
Avec CMake version 3.3.2, afin de créer
#define foo
J'avais besoin d'utiliser:
add_definitions(-Dfoo) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
et, afin d'avoir une définition de macro de préprocesseur comme celle-ci:
#define foo=5
la ligne est ainsi modifiée:
add_definitions(-Dfoo=5) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
add_definitions()
ou target_compile_definitions()
. La commande plus moderne,, add_compile_definitions()
n'a pas été ajoutée avant CMake 3.12. @ Leos313