基於 CMake 的 C 應用程式專案

    前言

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

    電子書籍

    如果讀者想要複習 C 程式設計相關的內容,可以參考以下書籍:

    現代 C 語言程式設計

    【分享本文】
    Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Yahoo
    【追蹤本站】
    Facebook Facebook Twitter