CMake 教程:从入门到实战(2025版)
CMake 是现代 C/C++ 项目最流行的构建系统工具,它跨平台、强大且灵活,能生成 Makefile、Ninja、Visual Studio 项目等。本教程从零基础开始,逐步带你掌握 CMake 的核心概念和实际使用。
1. 什么是 CMake?
- CMake 是一个构建系统生成器(build system generator),不是直接编译器。
- 它通过读取
CMakeLists.txt文件,生成适合当前平台的原生构建工具(如 Makefile 或 VS 项目)。 - 支持 Windows、Linux、macOS,以及 Android、iOS 等。
2. 安装 CMake
- Windows:去官网 https://cmake.org/download/ 下载安装包,安装时勾选“Add CMake to PATH”。
- macOS:
brew install cmake - Linux (Ubuntu/Debian):
sudo apt install cmake - 验证安装:终端运行
cmake --version
3. 第一个 CMake 项目:Hello World
项目结构:
hello/ ├── CMakeLists.txt ├── main.cppmain.cpp
#include<iostream>intmain(){std::cout<<"Hello, CMake!"<<std::endl;return0;}CMakeLists.txt(最简版)
cmake_minimum_required(VERSION 3.10) # 指定最低 CMake 版本 project(HelloCMake) # 项目名称 add_executable(hello main.cpp) # 生成可执行文件 hello,源文件是 main.cpp构建步骤:
cdhellomkdirbuild# 推荐:构建目录与源码分离cdbuild cmake..# 生成构建系统(Makefile 等)cmake --build.# 编译(等价于 make)./hello# 运行程序输出:Hello, CMake!
4. 核心命令详解
| 命令 | 作用 | 示例 |
|---|---|---|
cmake_minimum_required(VERSION x.y) | 指定最低 CMake 版本 | cmake_minimum_required(VERSION 3.15) |
project(name [LANGUAGES CXX C]) | 定义项目名和语言 | project(MyApp LANGUAGES CXX) |
add_executable(target sources...) | 生成可执行文件 | add_executable(app main.cpp util.cpp) |
| `add_library(target [STATIC | SHARED] sources…)` | 生成库 |
| `target_include_directories(target [PUBLIC | PRIVATE] dirs…)` | 添加头文件路径 |
target_link_libraries(target libs...) | 链接库 | target_link_libraries(app PRIVATE pthread) |
5. 多文件、多目录项目示例
项目结构:
myproject/ ├── CMakeLists.txt ├── main.cpp ├── src/ │ ├── math.cpp │ └── math.h └── include/ └── math.h (可复制或符号链接)根目录 CMakeLists.txt
cmake_minimum_required(VERSION 3.10) project(MyProject LANGUAGES CXX) # 添加子目录 add_subdirectory(src) add_executable(myapp main.cpp) target_link_libraries(myapp PRIVATE mathlib) target_include_directories(myapp PRIVATE include)src/CMakeLists.txt
add_library(mathlib STATIC math.cpp) target_include_directories(mathlib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/..) # 暴露头文件6. 常用变量与最佳实践
| 变量 | 含义 |
|---|---|
${CMAKE_SOURCE_DIR} | 项目根目录 |
${CMAKE_BINARY_DIR} | 构建目录(build) |
${CMAKE_CURRENT_SOURCE_DIR} | 当前 CMakeLists.txt 所在目录 |
${PROJECT_NAME} | 项目名称 |
推荐实践:
- 始终使用 out-of-source build(在 build 目录构建)。
- 使用
target_*命令而不是全局include_directories()、link_directories()(现代 CMake 风格)。
7. 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17) # 全局设置 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 或者针对特定目标 target_compile_features(myapp PRIVATE cxx_std_20)8. 查找外部库(FindPackage)
示例:使用 OpenCV
find_package(OpenCV REQUIRED) target_link_libraries(myapp PRIVATE ${OpenCV_LIBS}) target_include_directories(myapp PRIVATE ${OpenCV_INCLUDE_DIRS})常见包:Boost、Qt、Eigen、pthread 等。
9. 安装与打包
install(TARGETS myapp DESTINATION bin) install(FILES config.yaml DESTINATION etc/myapp) # 生成安装包(CPack) include(InstallRequiredSystemLibraries) set(CPACK_PACKAGE_NAME "MyApp") set(CPACK_GENERATOR "DEB;RPM;ZIP") include(CPack)运行cpack生成安装包。
10. 调试与常用选项
-DCMAKE_BUILD_TYPE=Debug/Release:设置构建类型-G "Ninja":使用 Ninja 构建(更快)ctest:运行测试(结合add_test())
11. 进阶:现代 CMake 推荐写法(CMake 3.15+)
cmake_minimum_required(VERSION 3.15) project(MyApp LANGUAGES CXX) add_executable(${PROJECT_NAME} main.cpp) target_sources(${PROJECT_NAME} PRIVATE src/util.cpp) target_include_directories(${PROJECT_NAME} PRIVATE include) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)小结
CMake 的学习曲线虽陡,但掌握后能极大提升项目管理效率。核心原则:
- 用
target_*命令管理依赖(现代方式)。 - 源码与构建分离。
- 明确指定 C++ 标准。
- 多用变量和函数提高可维护性。
如果你有具体需求(如集成 Qt、生成 VS 项目、交叉编译、单元测试等),欢迎继续提问,我可以提供针对性的示例!