510 votes

Debug vs Release dans CMake

Dans un projet compilé par GCC,

  • Comment puis-je exécuter CMake pour chaque type de cible (debug/release) ?
  • Comment puis-je spécifier les drapeaux C/C++ de débogage et de libération en utilisant CMake ?
  • Comment puis-je exprimer que l'exécutable principal sera compilé avec g++ et une bibliothèque imbriquée avec gcc ?

761voto

kb1ooo Points 1138

Avec CMake, il est généralement recommandé de faire un Construction "hors source". . Créez votre CMakeLists.txt dans la racine de votre projet. Puis à partir de la Racine de votre projet :

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

Et pour Debug (toujours à partir de la racine de votre projet) :

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

Release / Debug ajoutera les drapeaux appropriés pour votre compilateur. Il y a également RelWithDebInfo et MinSizeRel les configurations de construction.


Vous pouvez modifier/additionner les drapeaux en spécifiant une valeur de fichier de la chaîne d'outils dans lequel vous pouvez ajouter CMAKE_<LANG>_FLAGS_<CONFIG>_INIT variables, par exemple :

set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Wall")
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Wall")

Voir CMAKE_BUILD_TYPE pour plus de détails.


Quant à votre troisième question, je ne sais pas exactement ce que vous demandez. CMake devrait automatiquement détecter et utiliser le compilateur approprié pour vos différents fichiers sources.

4 votes

Vous pouvez également faire un cmake -i .. à la place, afin que cmake s'exécute interactivement, en vous demandant quel type de compilation vous voulez (None, Release, Debug, MinSizeRel, RelWithDebInfo).

6 votes

@thiagowfx -i donne lieu à ce message d'erreur : The "cmake -i" wizard mode is no longer supported. . J'utilise cmake 3.7.1

5 votes

Belle observation. Il semble qu'il ait été déprécié depuis la version 3.0.0 . Référence .

27voto

duncan Points 2298

Pour les drapeaux de débogage/de publication, voir le CMAKE_BUILD_TYPE (vous la passez comme cmake -DCMAKE_BUILD_TYPE=value ). Il prend des valeurs telles que Release , Debug etc.

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools

cmake utilise l'extension pour choisir le compilateur, donc nommez simplement vos fichiers .c.

Il est possible d'y remédier par divers réglages :

Par exemple :

set_source_files_properties(yourfile.c LANGUAGE CXX) 

Compilerait les fichiers .c avec g++. Le lien ci-dessus montre également comment sélectionner un compilateur spécifique pour C/C++.

24voto

sebastian Points 816

Au lieu de manipuler le CMAKE_CXX_FLAGS directement (ce qui pourrait être fait de manière plus efficace en utilisant les string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3") btw), vous pouvez utiliser add_compile_options :

add_compile_options(
  "-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
  "$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)

Cela ajoutera les avertissements spécifiés à tous les types de construction, mais seulement les drapeaux de débogage donnés à l'option DEBUG construire. Notez que les options de compilation sont stockées sous la forme d'une liste CMake, qui est juste une chaîne séparant ses éléments par des points-virgules ; .

21voto

Beaucoup de réponses ici sont dépassées/mauvaises. Je vais donc essayer d'y répondre mieux. Il est vrai que je réponds à cette question en 2020, donc on peut s'attendre à ce que les choses changent.


Comment puis-je exécuter CMake pour chaque type de cible (debug/release) ?

Tout d'abord, Debug/Release sont appelés des configurations dans cmake (point de détail).

Si vous utilisez un seul générateur de configuration (Ninja/Unix-Makefiles)

Ensuite, vous avez besoin d'un dossier de construction pour chaque configuration.

Comme ça :

# Configure the build
cmake -S . -B build/Debug -D CMAKE_BUILD_TYPE=Release

# Actually build the binaries
cmake --build build/Debug

Pour les générateurs de multi-configuration, c'est légèrement différent (Ninja Multi-Config, Visual Studio).

# Configure the build
cmake -S . -B build

# Actually build the binaries
cmake --build build --config Debug

Si vous vous demandez pourquoi cela est nécessaire, c'est parce que cmake n'est pas un système de construction. C'est un méta-système de construction (c'est-à-dire un système de construction qui construit des systèmes de construction). C'est essentiellement le résultat de la gestion des systèmes de compilation qui supportent plusieurs configurations dans une seule compilation. Si vous voulez une compréhension plus profonde, je vous suggère de lire un peu sur cmake dans le livre de Craig Scott "Professional CMake : A Practical Guide".


Comment puis-je spécifier les drapeaux C/C++ de débogage et de libération en utilisant CMake ?

La pratique moderne consiste à utiliser des cibles et des propriétés.

Voici un exemple :

add_library(foobar)

# Add this compile definition for debug builds, this same logic works for
# target_compile_options, target_link_options, etc.
target_compile_definitions(foobar PRIVATE
    $<$<CONFIG:Debug>:
        FOOBAR_DEBUG=1
    >
)

NOTE : Comment j'utilise les expressions du générateur pour spécifier la configuration ! L'utilisation de CMAKE_BUILD_TYPE entraînera de mauvaises constructions pour tout générateur multi-configuration !

De plus, il est parfois nécessaire de définir les choses de manière globale et pas seulement pour un seul objectif. Utilisez add_compile_definitions, add_compile_options, etc. Ces fonctions prennent en charge les expressions de générateur. N'utilisez pas l'ancien style de cmake à moins d'y être obligé (ce chemin est une terre de cauchemars).


Comment puis-je exprimer que l'exécutable principal sera compilé avec g++ et une bibliothèque imbriquée avec gcc ?

Votre dernière question n'a vraiment aucun sens.

11voto

Russel Waters Points 91

Si vous voulez construire une configuration différente sans régénérer si vous utilisez vous pouvez aussi exécuter cmake --build {$PWD} --config <cfg> Pour les outils de multi-configuration, choisissez <cfg> ex. Debug, Release, MinSizeRel, RelWithDebInfo

https://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X