Chcę tylko debugować kod działający w systemie Linux i potrzebuję kompilacji debugowania ( -O0 -ggdb
). Więc dodałem te rzeczy do mojego 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")
Kiedy próbowałem skompilować, włączyłem tryb gadatliwy make VERBOSE=1
i obserwowałem wyjście, w ten sposób
... /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 ...
Najwyraźniej kod jest skompilowany "-g -O2"
i nie tego chcę. Jak mogę zmusić go do używania "-O0 -ggdb"
tylko?
Odpowiedzi:
Trzeba ustawić flagi po tej
project
komendzie w swojej CMakeLists.txt.Ponadto, jeśli dzwonisz
include(${QT_USE_FILE})
lubadd_definitions(${QT_DEFINITIONS})
, powinieneś dołączyć teset
polecenia po poleceniach Qt, ponieważ dodają one dalsze flagi. Jeśli tak jest , może chcesz po prostu dołączyć swoje flagi do flag Qt, więc zmień na npźródło
QT_NO_EXCEPTIONS
w twoich flagach, więc trochę rozszerzyłem moją odpowiedź. Zgaduję, że${QT_DEFINITIONS}
jest to dołączanie-g -O2
.set
poleceń po poleceniach Qt rozwiązuje problem. Dziękuję Ci bardzo.Najłatwiejsze rozwiązanie działające dobrze dla mnie to:
CMake dołączy je do flag wszystkich konfiguracji. Po prostu wyczyść pamięć podręczną CMake.
źródło
CMAKE_CXX_FLAGS_DEBUG
itp.), To włączenie jejCXXFLAGS
(i tym samym wstrzyknięcie doCMAKE_CXX_FLAGS
) nie wystarcza w rzeczywistości do przekazania opcji kompilatorowi. Konfiguracja według typu kompilacji ma pierwszeństwo przed danymi wejściowymi użytkownika.Musisz zmienić domyślne FLAGI C / CXX cmake.
Według
CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE}
umieszczonego w głównym zCMakeLists.txt
nich:Dla C.
Dla C ++
Spowoduje to zastąpienie wartości zdefiniowanych w CMakeCache.txt
źródło
W systemach uniksowych dla kilku projektów dodałem te wiersze do CMakeLists.txt i kompilacja zakończyła się pomyślnie, ponieważ base ( / usr / include ) i local include ( / usr / local / include ) trafiają do oddzielnych katalogów:
Dołącza poprawny katalog, w tym ścieżki do flag kompilatorów C i C ++ oraz poprawną ścieżkę do katalogu dla flag konsolidatora.
Uwaga: kompilator C ++ (c ++) nie obsługuje -L, więc musimy użyć CMAKE_EXE_LINKER_FLAGS
źródło
include_directories
zamiast-I
flagi?CMAKE_CXX_FLAGS
, co spowodowało, że zostały zignorowane. Teraz, gdy umieściłem je wCMAKE_EXE_LINKER_FLAGS
oparciu o twoją odpowiedź, działają dobrze.