Debugowanie vs wydanie w CMake


435

W skompilowanym projekcie GCC

  • Jak uruchomić CMake dla każdego typu docelowego (debugowanie / wydanie)?
  • Jak określić debugowanie i zwolnić flagi C / C ++ za pomocą CMake?
  • Jak wyrazić, że główny plik wykonywalny zostanie skompilowany g++i jedna zagnieżdżona biblioteka gcc?

Odpowiedzi:


657

W przypadku CMake generalnie zaleca się wykonanie kompilacji „poza źródłem” . Utwórz CMakeLists.txtw katalogu głównym swojego projektu. Następnie z katalogu głównego projektu:

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

I dla Debug(ponownie z katalogu głównego twojego projektu):

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

Release/ Debugdoda odpowiednie flagi dla twojego kompilatora. Istnieją również RelWithDebInfoi MinSizeRelkonfiguracje kompilacji.


Możesz modyfikować / dodawać do flag, określając plik łańcucha narzędzi, w którym możesz dodawać CMAKE_C_FLAGS_DEBUGi CMAKE_C_FLAGS_RELEASEzmienne, np .:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")

Więcej informacji znajdziesz w CMAKE_BUILD_TYPE .


Co do trzeciego pytania, nie jestem pewien, o co dokładnie pytasz. CMake powinien automatycznie wykryć i używać kompilatora odpowiedniego dla różnych plików źródłowych.


3
Możesz także zrobić cmake -i ..zamiast tego, aby cmake działał interaktywnie, pytając, jakiego typu kompilację chcesz (Brak, Wydanie, Debugowanie, MinSizeRel, RelWithDebInfo).
thiagowfx,

5
@thiagowfx -iwyniki opcją w tym komunikatem o błędzie: The "cmake -i" wizard mode is no longer supported.. Używam cmake 3.7.1
Philipp Claßen

3
Niezła obserwacja. Wygląda na to, że był przestarzały od wersji 3.0.0. Odniesienia .
thiagowfx

7
To NIE jest kompilacja źródłowa, jeśli tworzysz podkatalog! Zaleca się utworzenie katalogu kompilacji poza / powyżej katalogu źródłowego.
Victor Lamoine,

Zauważ, że jeśli CMAKE_BUILD_TYPEnie jest ustawione, cmake nie wybierze żadnego domyślnego typu kompilacji, dlatego wygenerowany wiersz komend kompilatora nie będzie pasował do żadnej konfiguracji kompilacji.
David

23

W przypadku flag debugowania / zwalniania zobacz CMAKE_BUILD_TYPEzmienną (przekazujesz ją jako cmake -DCMAKE_BUILD_TYPE=value). Potrzeba takich wartości Release, Debugitp

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools

cmake używa rozszerzenia do wyboru kompilatora, więc po prostu nazwij swoje pliki .c.

Możesz to zmienić za pomocą różnych ustawień:

Na przykład:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

Kompilowałbym pliki .c z g ++. Powyższy link pokazuje również, jak wybrać konkretny kompilator dla C / C ++.


16

Zamiast manipulować CMAKE_CXX_FLAGSciągami bezpośrednio (co można zrobić ładniej przy użyciu string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")btw), możesz użyć add_compiler_options:

add_compile_options(
  "-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
  "$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)

Dodałoby to określone ostrzeżenia do wszystkich typów kompilacji, ale tylko podane flagi debugowania do DEBUGkompilacji. Zauważ, że opcje kompilacji są przechowywane jako lista CMake, która jest tylko ciągiem oddzielającym jej elementy średnikami ;.


2
Czy nie list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")dodasz średnika, zanim -g3 zakończy polecenie i nie uruchomi nowego polecenia -g3, które na pewno się nie powiedzie?
cburn11

Masz rację, nieCMAKE_CXX_FLAGS jest to lista cmake, ale ciąg rozdzielonych spacjami flag wiersza poleceń. Uważam, że takie zachowanie jest niespójne ...
Sebastian

add_compile_options () jest schludne. Uzupełnia go add_link_options (), gdy trzeba dodać opcje do linkera, takie jak -fsanitize = adres.
Bowie Owens,

1
Czy nadal jest to właściwy sposób w 2020 / cmake 3.17? Ta ostatnia linia wygląda paskudnie
Jay


5

// CMakeLists.txt: release

set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)

// CMakeLists.txt: debugowanie

set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)

10
nie rozumiem, dlaczego jest to przegłosowane, to prawdziwy kod, który został użyty w produkcji, ale nie obchodzi mnie to.
sailfish009

5
Może dlatego, że zgodnie z CMake dokumentacja CMAKE_CONFIGURATION_TYPESzawiera możliwe wartości CMAKE_BUILD_TYPE. Powinieneś więc ustawić to drugie, jak sugerują inne odpowiedzi. Być może twoje rozwiązanie działa, ponieważ ogranicza możliwe wybory do tego, który chciałbyś mieć.
bjhend

2
Głosuj, bo to zadziała. Uwielbiam trochę CMake, ale są dziwactwa i czasami trzeba użyć dużego młotka, aby wszystko działało. Mam kilka projektów, które z tego czy innego powodu odrzucą flagę wiersza poleceń.
cory.todd

Oto kilka dodatkowych informacji o tym, dlaczego to ustawienie może nie działać: stackoverflow.com/a/24470998/3196753
tresf
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.