web-dev-qa-db-fra.com

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

Je veux juste déboguer du code tournant sous Linux et j’ai besoin d’une version de débogage (-O0 -ggdb). Alors j'ai 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, j’ai tourné le sujet en utilisant make VERBOSE=1 Et j'ai observé la sortie, comme ça

... /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 à utiliser "-O0 -ggdb" seulement?

71
majie

Vous devez définir les indicateurs after la commande project dans votre CMakeLists.txt.

De même, si vous appelez include(${QT_USE_FILE}) ou add_definitions(${QT_DEFINITIONS}), vous devez inclure ces commandes set après les commandes Qt, car elles ajouteraient d'autres indicateurs. Si cela est le cas, vous voulez peut-être simplement ajouter vos drapeaux à ceux de Qt, changez pour par exemple.

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")
69
Fraser

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

Selon CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE}, Insérez dans le CMakeLists.txt L'un des éléments suivants:

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

12
carl-erwin

La solution la plus simple pour moi est la suivante:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake les ajoutera à tous les drapeaux de configuration.

7
Virus_7

Sur les systèmes Unix, pour plusieurs projets, j’ai ajouté ces lignes dans le fichier CMakeLists.txt et la compilation s’est bien déroulée car base (/usr/include) et local includes (/usr/local/include) allez 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 du compilateur C et C++, ainsi que le chemin du répertoire correct des 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

4
sbz