CMake是一個開源、跨平臺的編譯、測試和打包工具,它使用比較簡單的語言描述編譯、安裝的過程,輸出Makefile或者project文件,再去執行構建。
在使用IDE開發軟件的過程中,代碼的編譯和構建一般是使用IDE自帶的編譯工具和環境進行編譯,開發者參與的並不算多。如果想要控制構建的細節,則需要開發者自己定義構建的過程。
本文主要介紹以下內容:
- 編譯構建相關的核心概念及它們之間的關係
- CMake的一般使用流程
- 一個簡單的實例
一 核心概念
1 gcc、make和cmake
gcc(GNU Compiler Collection)將源文件編譯(Compile)成可執行文件或者庫文件;
而當需要編譯的東西很多時,需要說明先編譯什麼,後編譯什麼,這個過程稱爲構建(Build)。常用的工具是make,對應的定義構建過程的文件爲Makefile;
而編寫MakeFile對於大型項目又比較複雜,通過CMake就可以使用更加簡潔的語法定義構建的流程,CMake定義構建過程的文件爲CMakeLists.txt。
它們的大致關係如下圖:
這裏的GCC只是示例,也可以是其他的編譯工具。這裏的Bin表示目標文件,可以是可執行文件或者庫文件。
二 CMake一般使用流程
CMake提供cmake、ctest和cpack三個命令行工具分別負責構建、測試和打包。本文主要介紹cmake命令。
使用cmake一般流程爲:
- 生成構建系統(buildsystem,比如make工具對應的Makefile);
- 執行構建(比如make),生成目標文件;
- 執行測試、安裝或打包。
本文先介紹前面兩個步驟。
1 生成構建系統
通過cmake
命令生成構建系統。
通過cmake --help
可以看到cmake命令支持的詳細參數,常用的參數如下:
參數 | 含義 |
---|---|
-S | 指定源文件根目錄,必須包含一個CMakeLists.txt 文件 |
-B | 指定構建目錄,構建生成的中間文件和目標文件的生成路徑 |
-D | 指定變量,格式爲-D <var>=<value> ,-D後的空格可省略 |
比如,指明使用當前目錄作爲源文件目錄;使用build目錄作爲構建目錄;設定變量CMAKE_BUILD_TYPE
的值爲Debug
,變量AUTHOR
的值爲RealCoolEngineer
:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DAUTHOR=RealCoolEngineer
使用-D設置的變量在CMakeLists.txt中生效,可以設置cmake的內置支持的一些變量控制構建的行爲;當然也可以使用自定義的變量,在CMakeLists.txt中自行判斷做不同的處理。
2 執行構建
使用cmake --build [<dir> | --preset <preset>]
執行構建。
這裏要指定的目錄就是生成構建系統時指定的構建目錄。常用的參數如下:
參數 | 含義 |
---|---|
--target | 指定構建目標代替默認的構建目標,可以指定多個 |
--parallel/-j [<jobs>] | 指定構建目標時使用的進程數 |
在這一步,如果使用的是make構建工具,則可以在構建目錄下直接使用make命令。
三 CMake應用示例
1 一個簡單的例子
下面使用cmake編譯一個c語言的hello world程序。創建一個項目文件夾cmake-template
,目錄結構如下:
cmake-template
├── CMakeLists.txt
└── src
└── c
└── main.c
main.c內容如下:
// @Author: Farmer Li, 公衆號: 很酷的程序員/RealCoolEngineer
// @Date: 2021-04-24
#include <stdio.h>
int main(void) {
printf("Hello CMake!");
return 0;
}
CMakeLists.txt的內容如下:
cmake_minimum_required(VERSION 3.12)
project(cmake_template VERSION 1.0.0 LANGUAGE C CXX)
add_executable(demo src/c/main.c)
該CMakeLists.txt聲明瞭需要使用的cmake的最低版本;項目的名字、版本以及編譯語言;最後一句定義了通過源文件main.c生成可執行文件demo。
詳細的CMake語法在本文暫不展開,後續會有專門的文章介紹,敬請關注(#.#)。
2 生成構建系統
在cmake-template
目錄下,執行以下命令:
cmake -B build
執行完成後,在項目的根目錄下會創建build目錄,可以看到其中生成了Makefile
文件。
3 執行構建
還是在cmake-template
目錄下,執行以下命令:
cmake --build build
因爲使用的是make工具,所以也可以在build目錄直接執行make命令:
cd build && make && cd -
執行完成後,可以在build目錄下看到已經生成可執行文件demo
,執行demo:
➜ cmake-template # ./build/demo
Hello CMake!
上面演示了一個CMake的簡單demo,着重介紹CMake的使用流程和命令。
下一篇文章會介紹CMake常用的核心語法和更加複雜的demo。
本文示例代碼上傳到開源倉庫:
FarmerLi / cmake-template