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?

użytkownik4352158
źródło
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.

dan
źródło
8

Lub w czasie wywołania:

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

a następnie potwierdź za pomocą:

make VERBOSE=1

aby wyświetlić polecenia kompilacji GCC, jak wyjaśniono na stronie : /programming/5820303/how-do-i-force-make-gcc-to-show-me-the-commands

Testowane na Ubuntu 17.04, CMake 3.7.2.

Ciro Santilli
źródło
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")
Chip Christian
źródło