W przypadku CMake generalnie zaleca się wykonanie kompilacji „poza źródłem” . Utwórz CMakeLists.txt
w 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
/ Debug
doda odpowiednie flagi dla twojego kompilatora. Istnieją również RelWithDebInfo
i MinSizeRel
konfiguracje kompilacji.
Możesz modyfikować / dodawać do flag, określając plik łańcucha narzędzi, w którym możesz dodawać CMAKE_C_FLAGS_DEBUG
i CMAKE_C_FLAGS_RELEASE
zmienne, 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.
cmake -i ..
zamiast tego, aby cmake działał interaktywnie, pytając, jakiego typu kompilację chcesz (Brak, Wydanie, Debugowanie, MinSizeRel, RelWithDebInfo).-i
wyniki opcją w tym komunikatem o błędzie:The "cmake -i" wizard mode is no longer supported.
. Używam cmake 3.7.13.0.0
. Odniesienia .CMAKE_BUILD_TYPE
nie jest ustawione, cmake nie wybierze żadnego domyślnego typu kompilacji, dlatego wygenerowany wiersz komend kompilatora nie będzie pasował do żadnej konfiguracji kompilacji.W przypadku flag debugowania / zwalniania zobacz
CMAKE_BUILD_TYPE
zmienną (przekazujesz ją jakocmake -DCMAKE_BUILD_TYPE=value
). Potrzeba takich wartościRelease
,Debug
itphttps://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:
Kompilowałbym pliki .c z g ++. Powyższy link pokazuje również, jak wybrać konkretny kompilator dla C / C ++.
źródło
Zamiast manipulować
CMAKE_CXX_FLAGS
ciągami bezpośrednio (co można zrobić ładniej przy użyciustring(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")
btw), możesz użyćadd_compiler_options
:Dodałoby to określone ostrzeżenia do wszystkich typów kompilacji, ale tylko podane flagi debugowania do
DEBUG
kompilacji. Zauważ, że opcje kompilacji są przechowywane jako lista CMake, która jest tylko ciągiem oddzielającym jej elementy średnikami;
.źródło
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?CMAKE_CXX_FLAGS
jest to lista cmake, ale ciąg rozdzielonych spacjami flag wiersza poleceń. Uważam, że takie zachowanie jest niespójne ...Jeśli chcesz zbudować inną konfigurację bez ponownego generowania, jeśli ją używasz, możesz także uruchomić
cmake --build {$PWD} --config <cfg>
Dla narzędzi do wielu konfiguracji wybierz<cfg>
np. Debugowanie, wydanie, MinSizeRel, RelWithDebInfohttps://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir
źródło
--config
opcją bez rezultatu. Nie wpływa na$<CONFIG>
zmienną tak-DCMAKE_BUILD_TYPE=
jak.// CMakeLists.txt: release
// CMakeLists.txt: debugowanie
źródło
CMAKE_CONFIGURATION_TYPES
zawiera możliwe wartościCMAKE_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ć.