Ustaw opcje CFLAGS i CXXFLAGS za pomocą CMake

88

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?

majie
źródło
1
Jeśli potrzebujesz kompilacji z możliwością debugowania, po prostu wykonaj konfigurację debugowania w wierszu poleceń. „cmake -DCMAKE_BUILD_TYPE = Debuguj”. Wynikowa kompilacja będzie miała włączone flagi debugowania dla danego systemu kompilacji. Nie ma powodu, aby modyfikować sam plik cmake. Możesz również wysłać wartość CMAKE_C_FLAGS z innym argumentem -D.
Atifm

Odpowiedzi:

83

Trzeba ustawić flagi po tej projectkomendzie w swojej CMakeLists.txt.

Ponadto, jeśli dzwonisz include(${QT_USE_FILE})lub add_definitions(${QT_DEFINITIONS}), powinieneś dołączyć te setpolecenia 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

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")
Fraser
źródło
Umieściłem te flagi po poleceniu projektu. Ale wynik jest taki sam.
majie
Właśnie zauważyłem QT_NO_EXCEPTIONSw twoich flagach, więc trochę rozszerzyłem moją odpowiedź. Zgaduję, że ${QT_DEFINITIONS}jest to dołączanie -g -O2.
Fraser,
1
Tak, to jest to. Umieszczenie tych setpoleceń po poleceniach Qt rozwiązuje problem. Dziękuję Ci bardzo.
majie
18

Najłatwiejsze rozwiązanie działające dobrze dla mnie to:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake dołączy je do flag wszystkich konfiguracji. Po prostu wyczyść pamięć podręczną CMake.

Virus_7
źródło
3
Ustawienie flag w takim środowisku jest jedynym sposobem na zrobienie tego bez modyfikowania pliku CMakeLists.txt. Zwróć uwagę, że wartość środowiska jest odczytywana tylko przy pierwszej konfiguracji, a następnie umieszczana w pamięci podręcznej, więc jeśli chcesz to zmienić, musisz wyczyścić pamięć podręczną CMake i ponownie uruchomić krok konfiguracji z nowymi wartościami w pliku env. Dokumenty: cmake.org/cmake/help/latest/envvar/CFLAGS.html cmake.org/cmake/help/latest/envvar/CXXFLAGS.html
bleater
3
To nie jest „najłatwiejsze”, to jedyny właściwy sposób.
Slava
Drobny chwyt, jeśli generator konfiguruje konkretną flagę dla określonego typu kompilacji (np. W CMAKE_CXX_FLAGS_DEBUG itp.), To włączenie jej CXXFLAGS(i tym samym wstrzyknięcie do CMAKE_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.
Ext3h
15

Musisz zmienić domyślne FLAGI C / CXX cmake.

Według CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} umieszczonego w głównym z CMakeLists.txtnich:

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

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

Spowoduje to zastąpienie wartości zdefiniowanych w CMakeCache.txt

carl-erwin
źródło
który zastępuje aktualne flagi cmake. więc przerywa debugowanie, chyba że sam dodasz flagę -g (gcc)
activedecay
Czy to samo dotyczy składni „Modern Cmake”?
Sandburg
6

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:

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

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

sbz
źródło
3
Czy nie lepiej jest używać include_directorieszamiast -Iflagi?
Tejas Kale
Dziękuję bardzo. Umieszczałem flagi linkera w CMAKE_CXX_FLAGS, co spowodowało, że zostały zignorowane. Teraz, gdy umieściłem je w CMAKE_EXE_LINKER_FLAGSoparciu o twoją odpowiedź, działają dobrze.
Nahiyan