目錄
- 1. 項目結構設計
- 📦 結構說明
- 2. 項目文件內容
- 2.1 頂層 `CMakeLists.txt`
- 2.2 模塊 `src/color/CMakeLists.txt` ?【推薦寫法】
- ?是否需要寫 `project()`?
- 2.3 模塊頭文件 `include/color.h`
- 2.4 模塊實現文件 `src/color/color.c`
- 2.5 主程序 `src/main.c`
- 3. 構建與運行步驟
- ? 運行輸出:
- 4. 構建輸出目錄說明
- 5. 跨平臺構建支持(Windows / macOS / Linux)
- 🧠 在 CMake 中檢測平臺
- 🔧 跨平臺構建命令
- 6. 項目擴展建議
- 7. 項目總結與回顧
- 8. 最終項目結構(含構建結果)
- ? 附錄:子模塊的 CMake 最佳寫法模板
- 9. 結束語
- 相關文章:
CMake 是現代 C/C++ 項目中最主流的構建工具之一。它不僅可以幫助開發者組織源代碼、管理依賴、構建庫文件,還能提升項目的模塊化程度和可維護性。
本文將以一個簡單模塊 color
為例,介紹如何使用 CMake:
- 構建一個結構清晰的 C 項目;
- 將模塊編譯為靜態庫;
- 配置可執行程序鏈接庫;
- 自定義庫輸出路徑;
- 支持跨平臺構建(Windows/macOS/Linux)。
1. 項目結構設計
我們采用模塊化、分離構建思路組織項目結構:
your_project/
├── CMakeLists.txt # 頂層 CMake 構建腳本
├── include/ # 公共頭文件目錄
│ └── color.h
├── src/ # 源文件目錄
│ ├── main.c # 主程序入口
│ └── color/ # color 模塊目錄
│ ├── color.c
│ └── CMakeLists.txt # color 模塊構建配置
└── build/ # 構建輸出目錄(自動生成)
📦 結構說明
目錄/文件 | 說明 |
---|---|
include/ | 放置對外公開頭文件,便于跨模塊引用 |
src/color/ | 獨立模塊,具備獨立構建能力 |
build/ | 構建輸出與源代碼分離,保持干凈 |
CMakeLists.txt | 配置統一構建規則與鏈接流程 |
2. 項目文件內容
2.1 頂層 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(ColorApp C)set(CMAKE_C_STANDARD 99)# 設置庫和可執行文件的輸出路徑
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)# 添加頭文件搜索路徑
include_directories(include)# 添加 color 模塊
add_subdirectory(src/color)# 添加主程序
add_executable(${PROJECT_NAME} src/main.c)# 鏈接 color 模塊庫
target_link_libraries(${PROJECT_NAME} color)
2.2 模塊 src/color/CMakeLists.txt
?【推薦寫法】
# 可選但推薦:模塊自身聲明(便于大型項目調試)
project(ColorModule C)# 構建靜態庫 color
add_library(color STATIC color.c)# 添加頭文件目錄(可供外部 target 使用)
target_include_directories(color PUBLIC ${CMAKE_SOURCE_DIR}/include)
?是否需要寫 project()
?
- ? 小項目中可省略
- ? 推薦添加,可讀性更強、利于 IDE 顯示模塊名、利于分組構建。
- ?不要寫
cmake_minimum_required()
,它只應在頂層寫一次。
2.3 模塊頭文件 include/color.h
#ifndef COLOR_H
#define COLOR_Hvoid set_color(void);#endif
2.4 模塊實現文件 src/color/color.c
#include <stdio.h>
#include "color.h"void set_color(void) {printf("Set color called!\n");
}
2.5 主程序 src/main.c
#include "color.h"int main() {set_color();return 0;
}
3. 構建與運行步驟
在項目根目錄下執行以下命令進行構建:
mkdir build
cd build
cmake ..
make
./bin/ColorApp
? 運行輸出:
Set color called!
4. 構建輸出目錄說明
借助 CMAKE_*_OUTPUT_DIRECTORY
變量,我們可以控制構建產物的輸出位置:
變量名 | 描述 | 示例輸出路徑 |
---|---|---|
CMAKE_ARCHIVE_OUTPUT_DIRECTORY | 靜態庫 .a 輸出路徑 | build/lib/libcolor.a |
CMAKE_LIBRARY_OUTPUT_DIRECTORY | 動態庫 .so 輸出路徑 | build/lib/libcolor.so |
CMAKE_RUNTIME_OUTPUT_DIRECTORY | 可執行文件輸出路徑 | build/bin/ColorApp |
5. 跨平臺構建支持(Windows / macOS / Linux)
🧠 在 CMake 中檢測平臺
if(WIN32)message(STATUS "Compiling on Windows")add_definitions(-DPLATFORM_WINDOWS)
elseif(APPLE)message(STATUS "Compiling on macOS")add_definitions(-DPLATFORM_MACOS)
elseif(UNIX)message(STATUS "Compiling on Linux")add_definitions(-DPLATFORM_LINUX)
endif()
🔧 跨平臺構建命令
平臺 | 構建命令 |
---|---|
Linux/macOS | cmake .. && make |
Windows MinGW | cmake -G "MinGW Makefiles" .. && mingw32-make |
Windows Visual Studio | cmake -G "Visual Studio 17 2022" .. (生成 .sln) |
6. 項目擴展建議
你可以基于此結構輕松擴展為多模塊項目:
-
新增模塊如
art
,password
:- 創建目錄
src/art/
,放入art.c
,art.h
; - 添加對應
CMakeLists.txt
和庫配置;
- 創建目錄
-
所有模塊的頭文件統一放入
include/
; -
在頂層
CMakeLists.txt
中添加子目錄與鏈接即可; -
添加
tests/
目錄引入單元測試框架如CTest
、Google Test
。
7. 項目總結與回顧
關鍵點 | 內容 |
---|---|
使用 add_library() 構建靜態/動態庫 | 模塊化構建 |
使用 target_link_libraries() 連接模塊 | 清晰解耦 |
使用輸出變量設置生成目錄 | 可控構建產物結構 |
模塊 + 主程序分離 | 易于維護與擴展 |
支持跨平臺平臺適配 | Windows/macOS/Linux 構建 |
8. 最終項目結構(含構建結果)
your_project/
├── CMakeLists.txt # 頂層構建配置
├── include/
│ └── color.h # 模塊頭文件
├── src/
│ ├── main.c # 主程序
│ └── color/
│ ├── color.c # 模塊實現
│ └── CMakeLists.txt # 模塊構建配置
├── build/
│ ├── lib/
│ │ └── libcolor.a # 靜態庫輸出
│ └── bin/
│ └── ColorApp # 主程序輸出
? 附錄:子模塊的 CMake 最佳寫法模板
# src/color/CMakeLists.txt
project(ColorModule C)add_library(color STATIC color.c)target_include_directories(color PUBLIC ${CMAKE_SOURCE_DIR}/include)
9. 結束語
- 本節內容已經全部介紹完畢,希望通過這篇文章,大家對
CMake
有了更深入的理解和認識。- 感謝各位的閱讀和支持,如果覺得這篇文章對你有幫助,請不要吝惜你的點贊和評論,這對我們非常重要。再次感謝大家的關注和支持!點我關注??
相關文章:
- 指針的神秘探險:從入門到精通的奇幻之旅 !