Legen Sie die Optionen CFLAGS und CXXFLAGS mit CMake fest

85

Ich möchte nur Code debuggen, der unter Linux ausgeführt wird, und ich benötige einen Debug-Build ( -O0 -ggdb). Also habe ich diese Dinge zu meinem hinzugefügt 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")

Als ich versuchte zu kompilieren, schaltete make VERBOSE=1 ich die Verwendung ausführlich ein und beobachtete die Ausgabe wie folgt

... /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 ...

Anscheinend ist der Code kompiliert "-g -O2"und das ist nicht das, was ich will. Wie kann ich die Verwendung "-O0 -ggdb"nur erzwingen ?

Majie
quelle
1
Wenn Sie einen debuggbaren Build wünschen, führen Sie einfach eine Debug-Konfiguration in der Befehlszeile durch. "cmake -DCMAKE_BUILD_TYPE = Debug". Für den resultierenden Build sind die Debug-Flags für das angegebene Build-System aktiviert. Kein Grund, die cmake-Datei selbst zu ändern. Sie können den Wert CMAKE_C_FLAGS auch mit einem anderen Argument -D senden.
Atifm

Antworten:

79

Sie müssen die Flags nach dem projectBefehl in Ihrer CMakeLists.txt setzen.

Wenn Sie aufrufen include(${QT_USE_FILE})oder add_definitions(${QT_DEFINITIONS}), sollten Sie diese setBefehle nach den Qt-Befehlen einfügen, da diese weitere Flags anhängen würden. Wenn das ist der Fall, vielleicht wollen Sie nur Ihre Fahnen auf die Qt diejenigen anzuhängen, so Änderung zB

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")
Fraser
quelle
Ich habe diese Flags nach dem Projektbefehl gesetzt. Die Ausgabe ist jedoch dieselbe.
Majie
Ich habe gerade das QT_NO_EXCEPTIONSin deinen Flaggen bemerkt , also habe ich meine Antwort ein bisschen erweitert. Ich vermute, das ${QT_DEFINITIONS}hängt das an -g -O2.
Fraser
1
Ja, das ist es. Das Setzen dieser setBefehle nach den Qt-Befehlen löst das Problem. Vielen Dank.
Majie
16

Die einfachste Lösung, die für mich gut funktioniert, ist folgende:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake hängt sie an die Flags aller Konfigurationen an. Stellen Sie einfach sicher, dass Sie den CMake-Cache leeren.

Virus_7
quelle
3
Das Setzen der Flags in der Umgebung auf diese Weise ist die einzige Möglichkeit, dies zu tun, ohne Ihre CMakeLists.txt zu ändern. Beachten Sie, dass der Umgebungswert nur bei der ersten Konfiguration gelesen und dann in den Cache gestellt wird. Wenn Sie dies ändern möchten, müssen Sie den CMake-Cache löschen und den Konfigurationsschritt mit den neuen Werten in der Umgebung erneut ausführen. Docs: cmake.org/cmake/help/latest/envvar/CFLAGS.html cmake.org/cmake/help/latest/envvar/CXXFLAGS.html
Bleater
2
Das ist nicht "am einfachsten", das ist der einzig richtige Weg, es zu tun.
Slava
15

Sie müssen die Standard-FLAGS von cmake C / CXX ändern.

Nach CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} in der Hauptsache setzen CMakeLists.txtvon:

Für 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")

Für 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")

Dadurch werden die in CMakeCache.txt definierten Werte überschrieben

carl-erwin
quelle
das überschreibt deine aktuellen cmake-Flags. so bricht es das Debuggen, es sei denn, Sie fügen das Flag -g selbst hinzu (gcc)
activedecay
Gibt es das gleiche Denken bei der Verwendung der "Modern Cmake" -Syntax?
Sandburg
6

Auf Unix-Systemen habe ich für mehrere Projekte diese Zeilen in die Datei CMakeLists.txt eingefügt, und sie wurde erfolgreich kompiliert, weil Basis- ( / usr / include ) und lokale Includes ( / usr / local / include ) in getrennte Verzeichnisse :

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")

Es wird das richtige Verzeichnis angehängt, einschließlich der Pfade für die C- und C ++ - Compiler-Flags und des richtigen Verzeichnispfads für die Linker-Flags.

Hinweis: Der C ++ - Compiler (c ++) unterstützt -L nicht, daher müssen wir CMAKE_EXE_LINKER_FLAGS verwenden

sbz
quelle
2
Ist es nicht besser, include_directoriesanstelle der -IFlagge zu verwenden?
Tejas Kale
Ich danke dir sehr. Ich habe meine Linker-Flags eingefügt CMAKE_CXX_FLAGS, wodurch sie ignoriert wurden. Jetzt, wo ich sie CMAKE_EXE_LINKER_FLAGSbasierend auf Ihrer Antwort eingefügt habe, funktionieren sie einwandfrei.
Nahiyan