Ne set_target_properties dans CMake remplacer CMAKE_CXX_FLAGS?
Au début de mon CMake projet, je suis à la configuration générale des indicateurs de compilation dans la variable CMAKE_CXX_FLAGS, comme
set(CMAKE_CXX_FLAGS "-W -Wall ${CMAKE_CXX_FLAGS}")
Plus tard, j'ai besoin d'ajouter des supplémentaires spécifiques à la configuration options de compilation (stockées dans BUILD_FLAGS). Puis-je utiliser la commande suivante pour cette:
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS})
ou dois-je ajouter le CMAKE_CXX_FLAGS manuellement:
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${BUILD_FLAGS}")
pour éviter CMAKE_CXX_FLAGS être remplacé par des BUILD_FLAGS?
- Je crois qu'ils sont annexés à l'CMAKE_CXX_FLAGS, vous pouvez vérifier cela en invoquant une verbose faire fichier
make target VERBOSE=1
Vous devez vous connecter pour publier un commentaire.
D'utiliser la première:
Les drapeaux stockées dans BUILD_FLAGS sont ajoutés après CMAKE_CXX_FLAGS lors de la compilation des sources de la CIBLE. La documentation fait allusion à cela, mais je l'ai juste essayé pour vous en assurer.
La ligne de commande complet sera l'équivalent de:
Et de Ramon dit, vous pouvez toujours vérifier avec
make VERBOSE=1
.Le accepté réponse est encore à travailler, mais obsolète depuis 2013.
Cette réponse est fondée et de nouvelles fonctions de CMake v2.8.12, v3.3 et v3.13.
Depuis CMake-2.8.12 (2013)
Deux nouvelles commandes pour définir
CMAKE_CXX_FLAGS
:target_compile_options()
(pour une cible unique)add_compile_options()
(pour toutes les cibles)La documentation de la dernière version n'a pas beaucoup changé depuis cmake-2.8.12:
target_compile_options()
add_compile_options()
Dans votre cas vous pouvez utiliser:
Ou tout simplement si vous avez une cible unique:
Plus d'exemples
Obsolète
COMPILE_FLAGS
cmake-3.0 documentation drapeaux
COMPILE_FLAGS
comme obsolète:Si vous voulez toujours utiliser
set_target_properties()
vous pouvez utiliserCOMPILE_OPTIONS
au lieu deCOMPILE_FLAGS
:Depuis CMake-3.3 (2015)
Anton Petrov suggère d'utiliser des générateur d'expressions tel que présenté dans une réponse de ar31.
Le CMake générateur d'expressions s'applique à votre
${BUILD_FLAGS}
à:$<COMPILE_LANGUAGE:CXX>
(peut également êtreC
,CUDA
...)$<CXX_COMPILER_ID:Clang>
(peut également être
GNU
pourgcc
, ouMSVC
pour Visual C++... voir liste complète)(utiliser
$<C_COMPILER_ID:Clang>
au lieu de cela, si la langue est C)Dans votre cas vous pouvez utiliser:
ou sur les compilateurs:
Depuis CMake-3.13 (2018)
Une nouvelle fonction
target_link_options()
permettent de passer des options de l'éditeur de liens, comme mentionné par Craig Scott.Les différentes options pour les fichiers C et C++
La meilleure façon est de distinguer les C de fichiers et les fichiers de C++ à l'aide de deux cibles différentes.
set_target_properties()
avecLINK_FLAGS
de la même façon? Il semble qu'il n'accepte pas les plus d'un drapeau (Même sous forme de liste).set_target_properties()
. Cette fonction est un ancien de l'utilisation de CMake (près de Makefiles l'esprit). Espérons que vous trouverez un moyen moderne de l'utilisation de CMake. Amusez-vous, Cheersset_target_properties()
est encore utile de nos jours, et je l'utilise parfois pourset_target_properties(mylib PROPERTIES LINKER_LANGUAGE CXX)
ouset_target_properties(mylib PROPERTIES POSITION_INDEPENDENT_CODE True)
. Je veux dire, je préfère utiliser les fonctions modernestarget_*()
lorsque cela est possible. Vous voyez ce que je veux dire?target_link_options()
de commande qui comble cette lacune, mais vous avez toujours été en mesure de (ab)utilisationtarget_link_libraries()
pour ajouter de l'éditeur de liens drapeaux.$<$<COMPILE_LANGUAGE:C>:${BUILD_FLAGS_FOR_CXX}>
est probablement une erreur, il devrait plutôt être$<$<COMPILE_LANGUAGE:C>:${BUILD_FLAGS_FOR_C}>