web-dev-qa-db-fra.com

Définir une macro de préprocesseur via CMake?

Comment définir une variable de préprocesseur via CMake?

Le code équivalent serait #define foo.

242
Mythli

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.

351
ypnos

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 .

218
Jim Hunziker

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(....)
12
Leos313