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)

Zobacz na żywo na Coliru

  1. cmake_minimum_required(VERSION 2.4) ustawia minimalną wersję CMake wymaganą do oceny bieżącego skryptu.

  2. 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 ++.

  3. Za pomocą add_executable(app main.cpp) tworzona jest app kompilacji docelowej, która wywoła skonfigurowany kompilator z pewnymi domyślnymi flagami dla bieżącego ustawienia w celu skompilowania app wykonywalnej z podanego pliku źródłowego main.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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow