cmake Samouczek
Rozpoczęcie pracy z cmake
Szukaj…
Uwagi
CMake to narzędzie do definiowania i zarządzania kompilacjami kodu, głównie dla C ++.
CMake to narzędzie wieloplatformowe; Chodzi o to, aby mieć jedną definicję budowy projektu - co przekłada się na konkretne definicje kompilacji dla dowolnej obsługiwanej platformy.
Osiąga to poprzez połączenie z różnymi systemami kompilacji specyficznymi dla platformy; CMake to etap pośredni, który generuje dane wejściowe kompilacji dla różnych konkretnych platform. W systemie Linux CMake generuje pliki Makefiles; w systemie Windows może generować projekty Visual Studio i tak dalej.
Zachowanie kompilacji jest zdefiniowane w plikach CMakeLists.txt
- po jednym w każdym katalogu kodu źródłowego. Każdy katalog jest CMakeLists
Plik ten definiuje, co należy zrobić buildsystem w tym katalogu konkretnego. Określa również, które podkatalogi CMake powinien obsługiwać.
Typowe działania obejmują:
- Zbuduj bibliotekę lub plik wykonywalny z niektórych plików źródłowych w tym katalogu.
- Dodaj ścieżkę do ścieżki dołączania używanej podczas kompilacji.
- Zdefiniuj zmienne, których system budowania będzie używał w tym katalogu i jego podkatalogach.
- Wygeneruj plik na podstawie konkretnej konfiguracji kompilacji.
- Znajdź bibliotekę, która jest gdzieś w drzewie źródłowym.
Ostateczne pliki CMakeLists
mogą być bardzo jasne i proste, ponieważ każdy z nich ma tak ograniczony zakres. Każdy obsługuje tylko tyle kompilacji, ile jest w bieżącym katalogu.
Aby uzyskać oficjalne zasoby dotyczące CMake, zobacz Dokumentację i samouczek CMake.
Wersje
Wersja | Data wydania |
---|---|
3,9 | 2017-07-18 |
3.8 | 2017-04-10 |
3.7 | 11.11.2016 |
3.6 | 07.07.2016 |
3.5 | 08.03.2016 |
3.4 | 2015-11-12 |
3.3 | 2015-07-23 |
3.2 | 2015-03-10 |
3.1 | 17.12.2014 |
3.0 | 2014-06-10 |
2.8.12.1 | 08.11.2013 |
2.8.12 | 2013-10-11 |
2.8.11 | 2013-05-16 |
2.8.10.2 | 27.11.2012 |
2.8.10.1 | 07.11.2012 |
2.8.10 | 31.10.2012 |
2.8.9 | 09.08.2012 |
2.8.8 | 18.04.2012 |
2.8.7 | 30.12.2011 |
2.8.6 | 30.12.2011 |
2.8.5 | 2011-07-08 |
2.8.4 | 16.02.2011 |
2.8.3 | 2010-11-03 |
2.8.2 | 28.06.2010 |
2.8.1 | 17.03.2010 |
2.8 | 13.11.2009 |
2.6 | 2008-05-05 |
CMake Instalacja
Przejdź na stronę pobierania CMake i pobierz plik binarny dla swojego systemu operacyjnego, np. Windows, Linux lub Mac OS X. W systemie Windows kliknij dwukrotnie plik binarny, aby zainstalować. W systemie Linux uruchom plik binarny z terminala.
W systemie Linux można również zainstalować pakiety z menedżera pakietów dystrybucji. W systemie Ubuntu 16.04 można zainstalować aplikację wiersza polecenia i aplikację graficzną za pomocą:
sudo apt-get install cmake
sudo apt-get install cmake-gui
Na FreeBSD możesz zainstalować wiersz poleceń i graficzną aplikację opartą na Qt za pomocą:
pkg install cmake
pkg install cmake-gui
W systemie Mac OSX, jeśli używasz jednego z dostępnych menedżerów pakietów do zainstalowania oprogramowania, najbardziej godne uwagi są MacPorts ( MacPorts ) i Homebrew ( Homebrew ), możesz także zainstalować CMake za pomocą jednego z nich. Na przykład w przypadku MacPorts wpisz następujące polecenie
sudo port install cmake
zainstaluje CMake, podczas gdy w przypadku korzystania z menedżera pakietów Homebrew napiszesz
brew install cmake
Po zainstalowaniu CMake możesz łatwo sprawdzić, wykonując następujące czynności
cmake --version
Powinieneś zobaczyć coś podobnego do następującego
cmake version 3.5.1
CMake suite maintained and supported by Kitware (kitware.com/cmake).
Przełączanie między typami kompilacji, np. Debugowanie i wydanie
CMake zna kilka typów kompilacji, które zwykle wpływają na domyślne parametry kompilatora i linkera (takie jak tworzone informacje debugowania) lub alternatywne ścieżki kodu.
Domyślnie CMake jest w stanie obsługiwać następujące typy kompilacji:
- Debugowanie : zwykle klasyczna kompilacja debugowania zawierająca informacje debugowania, brak optymalizacji itp.
- Wydanie : Typowa wersja wydania bez informacji debugowania i pełnej optymalizacji.
- RelWithDebInfo:: Taki sam jak wersja , ale z informacjami debugowania.
- MinSizeRel : specjalna kompilacja wydania zoptymalizowana pod kątem rozmiaru.
Sposób obsługi konfiguracji zależy od używanego generatora.
Niektóre generatory (np. Visual Studio) obsługują wiele konfiguracji. CMake wygeneruje wszystkie konfiguracje naraz i możesz wybrać z IDE lub używając --config CONFIG
(z cmake --build
), którą konfigurację chcesz zbudować. W przypadku tych generatorów CMake dołoży wszelkich starań, aby wygenerować strukturę katalogu kompilacji, tak aby pliki z różnych konfiguracji nie stykały się ze sobą.
Generatory, które obsługują tylko jedną konfigurację (jak Unix Makefiles), działają inaczej. Tutaj aktywna konfiguracja jest określana przez wartość zmiennej CMake CMAKE_BUILD_TYPE
.
Na przykład, aby wybrać inny typ kompilacji, można wydać następujące polecenia wiersza poleceń:
cmake -DCMAKE_BUILD_TYPE=Debug path/to/source
cmake -DCMAKE_BUILD_TYPE=Release path/to/source
Skrypt CMake powinien unikać ustawiania samego CMAKE_BUILD_TYPE
, ponieważ ogólnie uważa się, że użytkownicy są za to odpowiedzialni.
Przełączanie generatorów z pojedynczą konfiguracją wymaga ponownego uruchomienia CMake. Kolejna kompilacja prawdopodobnie zastąpi pliki obiektowe utworzone we wcześniejszej konfiguracji.
Prosty projekt „Hello World”
Biorąc pod uwagę plik źródłowy C ++ main.cpp
definiujący funkcję main()
, towarzyszący plik CMakeLists.txt
(o następującej treści) poinstruuje CMake, aby wygenerował odpowiednie instrukcje kompilacji dla bieżącego systemu i domyślnego kompilatora C ++.
main.cpp ( C ++ Hello World Example )
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.4)
project(hello_world)
add_executable(app main.cpp)
cmake_minimum_required(VERSION 2.4)
ustawia minimalną wersję CMake wymaganą do oceny bieżącego skryptu.project(hello_world)
rozpoczyna nowy projekt CMake. Spowoduje to uruchomienie dużej wewnętrznej logiki CMake, zwłaszcza wykrycie domyślnego kompilatora C i C ++.Za pomocą
add_executable(app main.cpp)
tworzona jestapp
kompilacji docelowej, która wywoła skonfigurowany kompilator z pewnymi domyślnymi flagami dla bieżącego ustawienia w celu skompilowaniaapp
wykonywalnej z podanego pliku źródłowegomain.cpp
.
Wiersz poleceń (kompilacja wbudowana, niezalecane)
> cmake .
...
> cmake --build .
cmake .
wykrywa kompilator, ocenia CMakeLists.txt
w podanym .
katalog i generuje środowisko kompilacji w bieżącym katalogu roboczym.
cmake --build .
polecenie jest abstrakcją niezbędnego wywołania kompilacji / wykonania.
Wiersz poleceń (poza źródłem, zalecane)
Aby utrzymać kod źródłowy w czystości od wszelkich artefaktów kompilacji, należy wykonywać kompilacje „poza źródłami”.
> mkdir build
> cd build
> cmake ..
> cmake --build .
Lub CMake może również wyodrębnić podstawowe polecenia powłoki platformy z powyższego przykładu:
> cmake -E make_directory build
> cmake -E chdir build cmake ..
> cmake --build build
„Hello World” z wieloma plikami źródłowymi
Najpierw możemy określić katalogi plików nagłówkowych za pomocą include_directories()
, następnie musimy określić odpowiednie pliki źródłowe docelowego pliku wykonywalnego przez add_executable()
i upewnić się, że w plikach źródłowych jest dokładnie jedna funkcja main()
.
Poniżej znajduje się prosty przykład: zakłada się, że wszystkie pliki znajdują się w katalogu PROJECT_SOURCE_DIR
.
main.cpp
#include "foo.h"
int main()
{
foo();
return 0;
}
foo.h
void foo();
foo.cpp
#include <iostream>
#include "foo.h"
void foo()
{
std::cout << "Hello World!\n";
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.4)
project(hello_world)
include_directories(${PROJECT_SOURCE_DIR})
add_executable(app main.cpp foo.cpp) # be sure there's exactly one main() function in the source files
Możemy wykonać tę samą procedurę w powyższym przykładzie, aby zbudować nasz projekt. Następnie uruchomi się app
wykonująca
>./app
Hello World!
„Hello World” jako biblioteka
Ten przykład pokazuje, jak wdrożyć program „Hello World” jako bibliotekę i jak połączyć go z innymi obiektami docelowymi.
Załóżmy, że mamy taki sam zestaw plików źródłowych / nagłówkowych, jak w przykładzie http://www.riptutorial.com/cmake/example/22391/-hello-world--with-multiple-source-files . Zamiast budować z wielu plików źródłowych, możemy najpierw wdrożyć foo.cpp
jako bibliotekę za pomocą add_library()
a następnie połączyć go z programem głównym za pomocą target_link_libraries()
.
Zmieniamy CMakeLists.txt na
cmake_minimum_required(VERSION 2.4)
project(hello_world)
include_directories(${PROJECT_SOURCE_DIR})
add_library(applib foo.cpp)
add_executable(app main.cpp)
target_link_libraries(app applib)
i wykonując te same kroki, otrzymamy ten sam wynik.