位元詩人 [C 語言] 程式設計教學:基於 CMake 的 C 應用程式專案

C 語言專案
Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

在本文中,我們藉由以 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 來設置自己的專案。

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。