前言
在本文中,我們藉由以 CMake 為基礎的 Hello World 程式專案來展示 CMake 的使用方法。由於 C 程式的部分相當簡單,本文的重點會放在 CMake 的使用方式以及設定檔撰寫上面。
使用此專案
我們把這個微型專案放在 GitLab 上。使用 Git 即可將整個專案複製到本地端:
$ git clone https://gitlab.com/cwchen/cmake-hello-nested.git
如同其他的軟體專案,得先將工作目錄移動到專案的根目錄,以進行下一步動作:
$ cd cmake-hello-nested
單憑 CMake 的設定檔,是無法編譯 C 專案的。我們得先用 CMake generator 生成不同系統上的自動編譯軟體設定檔,接著根據生成的設定檔去編譯軟體。在本節中,我們分別以 Windows 和 Unix 為例,展示 CMake generator 的用法。
在 Windows 上,常見的 C 編譯器有 MSVC (Visual C++) 和 GCC (MinGW) 兩大系統。雖然 Visual C++ 對 C 標準比較落後,但微軟市佔率夠高,我們也無法忽略 Visual C++ 的存在。
Visual Studio 會附帶 NMake,所以我們用 CMake generator 生成 NMake 的設定檔:
C:\path\to\project> cmake -G "NMake Makefiles"
接著呼叫 NMake 來編譯此專案:
C:\path\to\project> nmake
在 Unix 或類 Unix 系統上,則會用 Make 來編譯 C 專案。使用以下指令來生成 Make 的設定檔:
$ cmake -G "Unix Makefiles"
但 Unix 的 Make 有多種實作品,CMake 的官方文件並沒有說明是 POSIX Make、GNU Make 還是其他的 Make 實作品。筆者建議是一律用 GNU Make 來編譯 C 專案,因 GNU Make 向後相容 POSIX Make,但反之則否。
接著使用 Make 來編譯此專案即可:
$ make
在這裡的 make
是 GNU Make,這是 GNU/Linux 上預設的 Make 實作品。若在非 GNU/Linux 的 Unix 或類 Unix 系統上,則可改用 gmake
。
撰寫 CMake 設定檔
CMake 預設的專案設定檔的檔名為 CMakeLists.txt 。為什麼尾端要刻意用 .txt 為副檔名呢?這應該是為了相容於 Windows。Unix 或類 Unix 系統的文字檔案不附帶副檔名也可以使用。
我們來看一下這個專案的 (加了行號註解的) CMakeLists.txt :
cmake_minimum_required(VERSION 2.6) #[[ 1 ]]
project(Hello) #[[ 2 ]]
set(EXECUTABLE_OUTPUT_PATH dist) #[[ 3 ]]
include_directories(${Hello_SOURCE_DIR}/src) #[[ 4 ]]
add_executable(hello #[[ 5 ]]
${Hello_SOURCE_DIR}/src/hello.c #[[ 6 ]]
) #[[ 7 ]]
在第 1 行設置可用的 CMake 最低版本。基本上,這個版本號是越低越好,因為可以相容於更多的系統。
如果覺得要逐一測版本號很麻煩,至少應該回推兩個版本號。在筆者寫這篇文章時,CMake 的穩定版本為 3.16 (3.1x)。所以,應該在 3.9 (3.x) 及 2.8 (2.x) 間測一下 CMakeLists.txt 的相容性。
在第 2 行設置專案名稱。這會影響一些自動編譯軟體的設定檔,像是 Visual Studio 的專案名稱會用到這項設置。
第 3 行設置專案的產出路徑。由於本專案是巢狀專案,我們將輸出放置在 dist 子目錄。
第 4 行設置原始碼的路徑。在本專案中,我們沒有用獨立的子目錄來存放標頭檔,直接引入 C 原始碼所在子目錄 src 即可。
第 5 行至第 7 行設置目標程式所需的 C 原始碼。本範例專案僅有單一 C 原始檔。
結語
在本文中,我們建立了簡單的 C 應用程式專案。讀者可參考本文的 CMakeLists.txt 來設置自己的專案。