Jak skompilować bez optymalizacji -O0 przy użyciu CMake


17

Używam Scientific Linux (SL). Próbuję skompilować projekt korzystający z wielu plików C ++ (.cpp).

W katalogu user/project/Buildwchodzę, makeaby skompilować i połączyć wszystkie pliki .cpp. Następnie muszę przejść do user/run/i wpisać./run.sh values.txt

Aby debugować za pomocą GDB, muszę przejść do, user/runa następnie wpisać gdb ../project/Build/bin/Projecti uruchomić, wchodzę run -Project INPUT/inputfile.txt. Próbuję jednak wydrukować wartość zmiennej za pomocą p variablename.

Jednak dostaję wiadomość s1 = <value optimized out>. Przeprowadziłem badania online i wydaje się, że muszę je skompilować bez optymalizacji, -O0aby rozwiązać ten problem. Ale gdzie mam to wprowadzić? W CMakeLists? Jeśli tak, to które CMakeLists? Ten w project/Buildlub project/src/project?


Czy próbowałeś po prostu ponownie uruchomić cmake z typem kompilacji ustawionym na DEBUG? np. (z katalogu Build)cmake -DCMAKE_BUILD_TYPE=DEBUG ..
steeldriver

1
Dlaczego nie opublikowano tego w przepełnieniu stosu?
Peter Mortensen

Odpowiedzi:


10

Odpowiedź Chipa była pomocna, jednak ponieważ SETwiersz nadpisał CMAKE_CXX_FLAGS_DEBUGto usunął -gdomyślną, co spowodowało, że mój plik wykonywalny został zbudowany bez informacji o debugowaniu. Potrzebowałem drobnej dodatkowej modyfikacji pliku CMakeLists.txt w katalogu źródłowym projektu, aby uzyskać plik wykonywalny zbudowany z informacjami o debugowaniu i -O0 optymalizacjami (w cmake w wersji 2.8.12.2).

Dodałem następujące do CMakeLists.txt, aby dodać -O0i pozostawić -gwłączone:

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

Dodaje to -O0optymalizację do flag używanych już do debugowania przez CMake i jest uwzględniane tylko w kompilacjach GCC, jeśli używasz projektu wieloplatformowego.



4

Dodaj to do CMakeLists.txt (ten w katalogu źródłowym projektu; nie dotykaj niczego w katalogu kompilacji):

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

i wtedy

$ cmake -DCMAKE_BUILD_TYPE=Debug

będzie działać. Alternatywnie po prostu dodaj to do CMakeLists.txt:

SET(CMAKE_CXX_FLAGS "-O0")
SET(CMAKE_C_FLAGS "-O0")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.