今天我們要透過幾個經典的 CMake 模板與範例,其實網路上已經有不少現成的 CMake 範例與專案骨架可供參考,依照不同的使用情境去挑選,能省下不少摸索的時間。以下我特別挑出 ttroy50/cmake-examples 以及 cpp-starter-project-cmake 這兩個專案來說明:
另外除了這兩個專案之外還有幾個專案,因為可以用的資源不少,所以簡單整理成以下表格給大家做初步的參考:
專案 | 性質 | add_library |
add_executable |
find_package |
install /export |
測試 (CTests/GTest) | 依賴管理/範例 | 備註 |
---|---|---|---|---|---|---|---|---|
ttroy50/cmake-examples | 範例集/教學 | ✔︎ | ✔︎ | 多數範例有 | 多數範例有 | 有些範例含測試 | 部分用 Fetch/外部包 | 範例由淺入深,著重「現代 CMake」用法。(GitHub) |
pr0g/cmake-examples | 範例集(特別強調安裝) | ✔︎ | ✔︎ | 有 | 重點(components 等) | 比重較小 | — | 強調最小可行、理解 install() 每一段作用。(GitHub) |
cpp-starter-project-cmake | 起始模板/骨架 | ✔︎(靜/動/頭檔皆可) | ✔︎ | 有 | 有(安裝/匯出/打包) | 有(測試、分析、文件) | 常見工具鏈/模組 | 一站式覆蓋 Build→Test→Analysis→Doc→Deploy。(GitHub) |
sunsided/cmake | 範例專案(最佳實踐) | ✔︎ | ✔︎ | 有(可 find_package() ) |
有(可安裝並版本化) | — | — | 支援以 add_subdirectory() 或 find_package() 整合,多版本併存安裝。(GitHub) |
gokhanettin/cmake-example | 多庫相依範例 | ✔︎(多個 lib) | 可能有(範例重點在庫) | 較少 | 較少 | — | — | 展示 target 介面與相依管理(sum/mul/factorial)。(GitHub |
onqtam/awesome-cmake | 資源彙整清單 | N/A | N/A | N/A | N/A | N/A | 連結大量模組/腳本/文章 | 不是可編譯專案,而是「導航清單」,含 modern vs. non-modern 指引。(GitHub) |
https://github.com/ttroy50/cmake-examples
這個專案算是一份CMake 的教學範例,把常見的 Cmake 使用情境做成小專案,讓人一步一步學習,而不是提供單一完整的大專案,主要是由許多簡單可以執行的小範例集成,基礎範例的方法大概會分成幾個
- 01-basic
- 最簡單的 CMakeLists.txt
- 如何建立一個執行檔 (add_executable
)
- 如何指定標頭檔與來源檔
- 02-sub-projects
- 怎麼處理多個子專案 (subdirectories)
- 例如一個 app/
目錄和一個 lib/
目錄,app 需要 link lib
- 03-library
- 如何建立靜態庫、動態庫 (add_library
)
- 如何在另一個程式中 target_link_libraries
去用它
- 04-packaging
- 示如何安裝 (install
)
- 如何產生可被 find_package
使用的 config
- 05-exporting
- 教你如何導出 target,讓別人可以 find_package
找到你的 library
- 06-tests
- 如何整合 CTest 跟 GoogleTest 做單元測試
- 07-ExternalContent / FetchContent
- 示範怎麼抓取外部專案,像是 GitHub 上的 repo,當作依賴一起編譯
- 08-advanced
- 一些比較複雜的情境,例如使用 generator expressions、interface libraries、或自訂指令
https://github.com/josephgarnier/cpp-starter-project-cmake
而 cpp-starter-project-cmake專案是一個 C++ + CMake 起手範本,設計給你快速建立新專案時使用,避免從零開始搭建
他的專案結構可以分為