[Cmake ajoute des paramètres de compilation] Plusieurs méthodes pour cmake pour augmenter les paramètres de compilation et les instructions de prétraitement


Décrivez brièvement plusieurs méthodes

CMake est un système de construction multiplateforme qui permet aux développeurs d'écrire un fichier simple pour décrire le processus de construction pour toutes les plateformes. Dans CMake, vous pouvez ajouter des paramètres de compilation et des directives de prétraitement des manières suivantes :

  1. Ajoutez des paramètres de compilation :

    • Utilisez add_compile_optionsles commandes. Cette commande sera ajoutée à toutes les cibles. Par exemple:

      add_compile_options(-Wall)
      
    • Utilisez target_compile_optionsles commandes. Cette commande ne sera ajoutée qu'à la cible spécifiée. Par exemple:

      target_compile_options(target PRIVATE -Wall)
      
    • set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ...")est un autre moyen courant d'ajouter des paramètres de compilation. Cette approche modifie directement les variables globales de CMake, de sorte qu'elle affecte toutes les cibles.

      Par exemple, si vous voulez ajouter -Walldes options de compilation, vous pouvez écrire :

      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
      

      Cette ligne de code signifie, sera -Wallajoutée à CMAKE_CXX_FLAGSla variable. CMAKE_CXX_FLAGSLa variable contient des options de compilation pour le compilateur C++.

      De même, pour un compilateur C, vous pouvez utiliser CMAKE_C_FLAGS:

      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
      

      Un inconvénient de cette approche est qu'elle affecte toutes les cibles, pas seulement une cible spécifique. Si vous souhaitez simplement ajouter des options de compilation pour une cible spécifique, vous devez utiliser target_compile_optionsla commande.

  2. Ajoutez une directive de prétraitement :

    • Utilisez add_definitionsles commandes. Cette commande sera ajoutée à toutes les cibles. Par exemple:

      add_definitions(-DDEBUG)
      
    • Utilisez target_compile_definitionsles commandes. Cette commande ne sera ajoutée qu'à la cible spécifiée. Par exemple:

      target_compile_definitions(target PRIVATE DEBUG)
      

    Dans les deux exemples ci-dessus, DEBUGil s'agit d'une directive de prétraitement, qui sera définie au moment de la compilation.

Notez, PRIVATE, PUBLIC, INTERFACEla signification de ces mots-clés :

  • PRIVATE: Seule la cible elle-même utilisera ces paramètres de compilation.
  • PUBLIC: La cible elle-même et les autres cibles qui dépendent de cette cible utiliseront ces paramètres de compilation.
  • INTERFACE: Seules les autres cibles qui dépendent de cette cible utiliseront ces paramètres de compilation.

Ce qui précède sont toutes les façons d'ajouter des paramètres de compilation et des instructions de prétraitement dans CMake.

analyse add_definitions

Selon la documentation officielle de CMake, add_definitionsla commande est utilisée pour ajouter l'indicateur de définition -D à la compilation des fichiers source. Cette commande peut être utilisée pour ajouter n'importe quel indicateur, mais elle est principalement utilisée pour ajouter des définitions de préprocesseur.

Par exemple, add_definitions(-DFOO -DBAR ...)les définitions seront ajoutées à la ligne de commande du compilateur pour les cibles dans le répertoire courant, que cette commande soit appelée avant ou après l'ajout de la cible, et les cibles dans les sous-répertoires ajoutées après l'appel de cette commande.

Cependant, cette commande a été remplacée par l'alternative suivante :

  • Utilisez add_compile_definitions()pour ajouter des définitions de préprocesseur.
  • Utilisez include_directories()pour ajouter des répertoires inclus.
  • Utilisez add_compile_options()pour ajouter des options supplémentaires.

Les drapeaux commençant par -D ou /D, qui ressemblent à des définitions de préprocesseur, sont automatiquement ajoutés à la propriété de répertoire COMPILE_DEFINITIONS du répertoire courant. Les définitions avec des valeurs non triviales peuvent rester dans le jeu d'indicateurs au lieu d'être converties, pour des raisons de compatibilité descendante.

Vous avez donc raison de dire que add_definitionsla commande peut être utilisée pour ajouter des indicateurs de compilateur, mais ce n'est pas pour cela qu'elle est principalement utilisée, et cela peut causer des problèmes dans certains cas. Pour les indicateurs de compilateur tels que -Wall et -g, add_compile_options()la commande est plus recommandée.

analyse add_compile_options

add_compile_optionsLa commande permet d'ajouter des options à la compilation des fichiers sources. Ces options sont ajoutées à la propriété de répertoire COMPILE_OPTIONS et sont utilisées lors de la compilation des cibles dans le répertoire courant et ses sous-répertoires. Il convient de noter que ces options ne seront pas utilisées lors de la liaison et que les options au moment de la liaison doivent être add_link_options()ajoutées à l'aide de commandes.

add_compile_optionsLes paramètres de la commande peuvent utiliser des expressions de générateur, et le jeu d'options final pour la cible est construit en accumulant des options à partir des exigences d'utilisation de la cible actuelle et de ses dépendances. Le jeu d'options est dédupliqué pour éviter la duplication.

Par exemple, vous pouvez utiliser cette commande sous certaines conditions du compilateur :

if (MSVC)
 # warning level 4
 add_compile_options(/W4)
else()
 # additional warnings
 add_compile_options(-Wall -Wextra -Wpedantic)
endif()

Si vous souhaitez ajouter des options de compilation pour une cible spécifique, vous devez utiliser target_compile_optionsla commande. Par exemple, si vous avez une cible appelée my_target, vous pouvez lui ajouter des options de compilation comme ceci :

target_compile_options(my_target PRIVATE -Wall -Wextra -Wpedantic)

Dans cet exemple, -Wall -Wextra -Wpedanticces options de compilation ne seront ajoutées qu'à my_targetcette cible et n'affecteront pas les autres cibles.

La différence entre les différents usages

CMAKE_<LANG>_FLAGSest un indicateur global utilisé pour tous les langages de construction au moment de la configuration. Ces drapeaux seront transmis à toutes les invocations du compilateur, y compris celles qui pilotent la compilation et celles qui pilotent la liaison.

Pour chaque langage, si cette variable n'est pas définie, elle est initialisée avec les variables d'environnement et les valeurs par défaut intégrées de la chaîne d'outils de CMake et stockée dans le cache. Par exemple, CMAKE_CXX_FLAGSil sera initialisé par la variable d'environnement CXXFLAGS.

Cette valeur est un fragment de chaîne de ligne de commande, par conséquent, plusieurs options doivent être séparées par des espaces et les options avec des espaces doivent être entre guillemets.

CMAKE_<LANG>_FLAGS_<CONFIG>Les drapeaux de cette variable seront passés avant les drapeaux de chaque variable configurée . Les drapeaux de ces deux variables seront passés avant les drapeaux ajoutés par les commandes add_compile_options()et etc . lors de l' invocation de la compilation du pilote . Ils sont passés avant les drapeaux ajoutés par les commandes et etc target_compile_options()lors de l'invocation du lien du pilote .add_link_options()target_link_options()

Par conséquent, add_compile_optionsles deux set(CMAKE_CXX_FLAGS ...)et peuvent être utilisés pour ajouter des options de compilation, mais leurs scénarios d'utilisation et leur portée d'influence sont différents. add_compile_optionsPlus flexibles, des options peuvent être ajoutées dans des conditions spécifiques, tandis que set(CMAKE_CXX_FLAGS ...)les paramètres globaux affectent toutes les cibles. Ces deux commandes peuvent être utilisées en même temps, leurs effets sont cumulatifs et ne se remplacent pas.

épilogue

La compréhension est une étape importante vers le niveau suivant dans notre parcours d'apprentissage de la programmation. Cependant, maîtriser de nouvelles compétences et idées demande toujours du temps et de la persévérance. D'un point de vue psychologique, l'apprentissage s'accompagne souvent d'essais et d'erreurs continus et d'ajustements, c'est comme si notre cerveau optimisait progressivement son « algorithme » pour résoudre les problèmes.

C'est pourquoi, lorsque nous rencontrons des erreurs, nous devons les voir comme des opportunités d'apprendre et de nous améliorer, pas seulement comme des obsessions. En comprenant et en résolvant ces problèmes, nous pouvons non seulement corriger le code actuel, mais aussi améliorer notre capacité de programmation et éviter que les mêmes erreurs ne se reproduisent dans de futurs projets.

J'encourage tout le monde à participer activement et à améliorer continuellement leurs compétences en programmation. Que vous soyez un débutant ou un développeur expérimenté, j'espère que mon blog pourra vous aider dans votre parcours d'apprentissage. Si vous trouvez cet article utile, vous pouvez cliquer pour le mettre en signet, ou laisser vos commentaires pour partager vos idées et vos expériences.Vous êtes également invités à faire des suggestions et des questions sur le contenu de mon blog. Chaque like, commentaire, partage et suivi est le plus grand soutien pour moi et la motivation pour moi de continuer à partager et à créer.


Lisez ma page d'accueil CSDN pour débloquer du contenu plus intéressant : page d'accueil CSDN de Bubble
insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/qq_21438461/article/details/131719466
conseillé
Classement