目录
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_H
void 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
有了更深入的理解和认识。- 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持!点我关注❤️