Définir les options CFLAGS et CXXFLAGS à l'aide de CMake

88

Je veux juste déboguer du code fonctionnant sous Linux et j'ai besoin d'un debug build ( -O0 -ggdb). J'ai donc ajouté ces choses à mon CMakeLists.txt:

set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")

Quand j'ai essayé de compiler, je suis devenu verbeux en utilisant make VERBOSE=1 Et j'ai observé la sortie, comme ceci

... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor 
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W 
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS 
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics 
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2** 
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...

Apparemment, le code est compilé avec "-g -O2"et ce n'est pas ce que je veux. Comment puis-je le forcer à l'utiliser "-O0 -ggdb"uniquement?

majie
la source
1
Si vous voulez une version déboguable, effectuez simplement une configuration de débogage sur la ligne de commande. "cmake -DCMAKE_BUILD_TYPE = Déboguer". La construction résultante aura les indicateurs de débogage activés pour le système de construction donné. Aucune raison de modifier le fichier cmake lui-même. Vous pouvez également envoyer la valeur CMAKE_C_FLAGS avec un autre argument -D.
Atifm

Réponses:

83

Vous devez définir les indicateurs après la projectcommande dans votre CMakeLists.txt.

De plus, si vous appelez include(${QT_USE_FILE})ou add_definitions(${QT_DEFINITIONS}), vous devez inclure ces setcommandes après celles de Qt car elles ajouteraient d'autres indicateurs. Si tel est le cas, vous voudrez peut-être simplement ajouter vos drapeaux à ceux de Qt, alors changez en par exemple

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")
Fraser
la source
J'ai mis ces drapeaux après la commande de projet. Mais le résultat est le même.
majie
Je viens de remarquer le QT_NO_EXCEPTIONSdans vos drapeaux, alors j'ai prolongé un peu ma réponse. Je suppose que cela ${QT_DEFINITIONS}ajoute le fichier -g -O2.
Fraser
1
Oui, c'est ça. Mettre ces setcommandes après celles de Qt résout le problème. Merci beaucoup.
majie
18

La solution la plus simple qui fonctionne bien pour moi est la suivante:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake les ajoutera aux drapeaux de toutes les configurations. Assurez-vous simplement de vider le cache CMake.

Virus_7
la source
3
Définir les indicateurs dans l'environnement comme celui-ci est la seule façon de le faire sans modifier votre CMakeLists.txt. Notez que la valeur d'environnement n'est lue que lors de la première configuration et est ensuite placée dans le cache, donc si vous souhaitez modifier cela, vous devez effacer le cache CMake et réexécuter l'étape de configuration avec les nouvelles valeurs de l'environnement env. Docs: cmake.org/cmake/help/latest/envvar/CFLAGS.html cmake.org/cmake/help/latest/envvar/CXXFLAGS.html
bleater
3
Ce n'est pas "le plus simple", c'est la seule bonne façon de le faire.
Slava
Petit problème, si le générateur configure un indicateur spécifique pour un type de construction spécifique (par exemple, dans CMAKE_CXX_FLAGS_DEBUG etc.), alors l'inclure dans CXXFLAGS(et ainsi l'injecter dans CMAKE_CXX_FLAGS) ne suffit pas réellement pour passer l'option au compilateur. La configuration par type de construction est prioritaire sur l'entrée utilisateur.
Ext3h
15

Vous devez changer les FLAGS par défaut de cmake C / CXX.

Selon CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} mettre dans le principal CMakeLists.txtde:

Pour C

set(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")

Pour C ++

set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")

Cela remplacera les valeurs définies dans CMakeCache.txt

carl-erwin
la source
qui remplace vos indicateurs cmake qui sont en cours. donc il interrompt le débogage sauf si vous ajoutez vous-même l'indicateur -g (gcc)
activedecay
Existe-t-il la même chose en utilisant la syntaxe "Modern Cmake"?
Sandburg
6

Sur les systèmes Unix, pour plusieurs projets, j'ai ajouté ces lignes dans le CMakeLists.txt et la compilation était réussie car base ( / usr / include ) et local includes ( / usr / local / include ) vont dans des répertoires séparés:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")

Il ajoute le répertoire correct, y compris les chemins des indicateurs de compilateur C et C ++ et le chemin de répertoire correct pour les indicateurs de l'éditeur de liens.

Remarque: le compilateur C ++ (c ++) ne prend pas en charge -L, nous devons donc utiliser CMAKE_EXE_LINKER_FLAGS

sbz
la source
3
N'est-il pas préférable d'utiliser à la include_directoriesplace du -Idrapeau?
Tejas Kale
Merci beaucoup. Je plaçais mes indicateurs de l'éditeur de liens CMAKE_CXX_FLAGS, ce qui les a ignorés. Maintenant que je les ai placés en CMAKE_EXE_LINKER_FLAGSfonction de votre réponse, ils fonctionnent très bien.
Nahiyan