So kompilieren Sie ohne Optimierungen -O0 mit CMake

17

Ich benutze Scientific Linux (SL). Ich versuche, ein Projekt zu kompilieren, das eine Reihe von C ++ (.cpp) -Dateien verwendet.

In das Verzeichnis gebe user/project/Buildich ein make, um alle CPP-Dateien zu kompilieren und zu verknüpfen. Ich muss dann gehen user/run/und dann tippen./run.sh values.txt

Um mit GDB zu debuggen, muss ich gehen user/runund dann gdb ../project/Build/bin/Projecteingeben und ausführen, ich gebe ein run -Project INPUT/inputfile.txt. Ich versuche jedoch, den Wert der Variablen mit auszudrucken p variablename.

Ich bekomme jedoch die Nachricht s1 = <value optimized out>. Ich habe online recherchiert und es scheint, dass ich ohne Optimierungen kompilieren muss -O0, um dies zu beheben. Aber wo gebe ich das ein? In der CMakeLists? Wenn ja, welche CMakeLists? Der in project/Buildoder project/src/project?

user4352158
quelle
Haben Sie versucht, cmake einfach noch einmal mit dem Build-Typ DEBUG auszuführen? zB (aus dem Build-Verzeichnis)cmake -DCMAKE_BUILD_TYPE=DEBUG ..
steeldriver
1
Warum wurde dies nicht auf Stack Overflow gepostet?
Peter Mortensen

Antworten:

10

Die Antwort von Chip war hilfreich, da die SETZeile CMAKE_CXX_FLAGS_DEBUGdies überschrieb , wurde der -gStandardwert entfernt, der dazu führte , dass meine ausführbare Datei ohne Debug-Informationen erstellt wurde. Ich musste eine kleine zusätzliche Änderung an CMakeLists.txt im Projektquellverzeichnis vornehmen, um eine ausführbare Datei zu erhalten, die Debugging-Informationen und -O0 Optimierungen enthält (unter cmake Version 2.8.12.2).

Ich habe Folgendes zu CMakeLists.txt hinzugefügt, um es hinzuzufügen -O0und -gaktiviert zu lassen:

# Add -O0 to remove optimizations when using gcc
IF(CMAKE_COMPILER_IS_GNUCC)
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")
    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")
ENDIF(CMAKE_COMPILER_IS_GNUCC)

Dies fügt die -O0Optimierung den Flags hinzu, die bereits für das Debugging von CMake verwendet wurden, und ist nur für GCC-Builds enthalten, wenn Sie zufällig ein plattformübergreifendes Projekt verwenden.

Dan
quelle
8

Oder zum Zeitpunkt des Aufrufs:

cmake -DCMAKE_BUILD_TYPE=DEBUG \
      -DCMAKE_C_FLAGS_DEBUG="-g -O0" \
      -DCMAKE_CXX_FLAGS_DEBUG="-g -O0"

und bestätigen Sie mit:

make VERBOSE=1

Zeigen Sie die GCC-Build-Befehle wie folgt an: /programming/5820303/how-do-i-force-make-gcc-to-show-me-the-commands

Getestet unter Ubuntu 17.04, CMake 3.7.2.

Ciro Santilli ist ein Schauspieler
quelle
4

Fügen Sie dies zu CMakeLists.txt hinzu (das im Projektquellverzeichnis; berühren Sie nichts im Erstellungsverzeichnis):

SET(CMAKE_CXX_FLAGS_DEBUG "-O0")
SET(CMAKE_C_FLAGS_DEBUG "-O0")

und dann

$ cmake -DCMAKE_BUILD_TYPE=Debug

wird funktionieren. Alternativ können Sie dies auch zu CMakeLists.txt hinzufügen:

SET(CMAKE_CXX_FLAGS "-O0")
SET(CMAKE_C_FLAGS "-O0")
Chip Christian
quelle