Comment définir une macro préprocesseur C++ via la ligne de commande avec CMake?
J'essaie de définir une macro préprocesseur dans la ligne de commande CMake. J'ai essayé:
set generator="Visual Studio 8 2005"
set params=-D MY_MACRO=1
cmake.exe -G %generator% %params% ..\some_project
mais ce n'est pas définie lorsque je compile et je ne peux trouver le nom MY_MACRO
dans les fichiers générés par CMake, à l'exception de CMakeCache.txt
où il est présent sous la forme:
MY_MACRO:UNINITIALIZED=1
Comment puis-je le faire?
- Si vous avez résolu ce problème en maintenant, je serais intéressé par la solution
- Vous ne pouvez pas injecter des macros à partir de la ligne de commande, vous pouvez uniquement modifier les macros qui sont définis dans CMakeLists.txt. Aussi, définir params=-D MY_MACRO=1 doit être définie params=-DMY_MACRO=1
- oui, voir ma réponse ci-dessous.
- J'étais intéressé il y a 7 ans 😉 Merci de fournir une réponse de toute façon, je suis sûr que ça va aider beaucoup d'autres.
Vous devez vous connecter pour publier un commentaire.
Une bonne alternative serait de définir un cmake option:
Suivie par une condition:
Vous pouvez activer cette option on/OFF via la ligne de commande avec cmake à l'aide de la
-D
drapeau. Exemple:Assurez-vous que le compilateur est la réception de la définition à droite, vous pouvez faire appel en mode verbose et de vérifier pour la macro définie ou non:
C'est une bonne solution aussi parce que
make
est de recompiler votre code lorsque l'un quelconque de cmake options de change.Essayez ceci:
-D CMAKE_CXX_FLAGS=/DMY_MACRO=1
CMAKE_CXX_FLAGS
. J'ai essayé-D CMAKE_CXX_FLAGS="/DMY_MACRO=1 ${CMAKE_CXX_FLAGS}"
mais${CMAKE_CXX_FLAGS}
n'est pas obtenir étendue. Quelqu'un sait comment résoudre ce problème?/DMY_MACRO=1 ${CMAKE_CXX_FLAGS}
directement pour le compilateur.La motivation derrière la question était de créer lot 3e partie les bibliothèques, c'est pourquoi j'ai voulu éviter de modifier CMakeLists. Années plus tard, même si je n'ai pas besoin de plus, j'ai compris que c'est facilement réalisable par des moyens externes à CMake:
Invoquer CMake comme d'habitude, aucun des indicateurs.
Alors:
Avec MSVC: le compilateur lit Le
CL
variable d'environnement pour obtenir d'autres arguments de ligne de commande. Doncensuite invoquer MSBuild pour faire son travail.
Avec d'autres toolchains: Il pourrait être faisable par la mise en
CFLAGS
ouCXXFLAGS
variables d'environnement avant de faire appel àmake
, mais je ne l'ai pas vérifié.Sauf si vous avez une bonne raison de ne pas, vous devez utiliser
ADD_DEFINITIONS(<name>=<value>[, ...])
.Il suffit d'ajouter la ligne suivante à votre CMakeLists.txt:
CMake va prendre soin de la syntaxe des commutateurs (que ce soit
-D<name>=<value>
, ou/D<name>=<value>
).