CMake應用:基礎篇

CMake是一個開源、跨平臺的編譯、測試和打包工具,它使用比較簡單的語言描述編譯、安裝的過程,輸出Makefile或者project文件,再去執行構建。

在使用IDE開發軟件的過程中,代碼的編譯和構建一般是使用IDE自帶的編譯工具和環境進行編譯,開發者參與的並不算多。如果想要控制構建的細節,則需要開發者自己定義構建的過程。

本文主要介紹以下內容:

  1. 編譯構建相關的核心概念及它們之間的關係
  2. CMake的一般使用流程
  3. 一個簡單的實例

一 核心概念

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一般流程爲:

  1. 生成構建系統(buildsystem,比如make工具對應的Makefile);
  2. 執行構建(比如make),生成目標文件;
  3. 執行測試、安裝或打包。

本文先介紹前面兩個步驟。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章