Comment définir une variable de préprocesseur via CMake?
Le code équivalent serait #define foo
.
Pendant longtemps, CMake avait la commande add_definitions
à cette fin. Cependant, la commande a récemment été remplacée par une approche plus fine (commandes séparées pour les définitions de compilation, les répertoires d'inclusion et les options du compilateur).
Un exemple utilisant le nouveau 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 de ceci est qu’elle contourne la supercherie minable que CMake a mise en place pour add_definitions
. CMake est un système minable, mais ils trouvent enfin un peu de bon sens.
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 le faire par cible, comme expliqué dans la réponse de Jim Hunziker.
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 construisez plus d'une cible et que vous ne voulez pas qu'elles utilisent toutes les mêmes drapeaux. Voir également la documentation officielle sur target_compile_definitions .
Les autres solutions proposées sur cette page sont utiles uniquement pour les anciennes versions de Cmake . Voici la solution pour une nouvelle version. Vérifiez la version de votre Cmake à l'aide de
$ cmake --version
et choisissez la solution qui correspond à vos besoins. Le documentation de cmake peut être trouvé 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, pour 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(....)