CMake 教程

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”。
  • macOSbrew install cmake
  • Linux (Ubuntu/Debian)sudo apt install cmake
  • 验证安装:终端运行 cmake --version

3. 第一个 CMake 项目:Hello World

项目结构:

hello/
├── CMakeLists.txt
├── main.cpp

main.cpp

#include <iostream>
int main() {
    std::cout << "Hello, CMake!" << std::endl;
    return 0;
}

CMakeLists.txt(最简版)

cmake_minimum_required(VERSION 3.10)  # 指定最低 CMake 版本
project(HelloCMake)                   # 项目名称

add_executable(hello main.cpp)        # 生成可执行文件 hello,源文件是 main.cpp

构建步骤

cd hello
mkdir build          # 推荐:构建目录与源码分离
cd build
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...)生成库add_library(mylib STATIC src.cpp)
target_include_directories(target [PUBLIC|PRIVATE] dirs...)添加头文件路径target_include_directories(app PRIVATE include)
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 的学习曲线虽陡,但掌握后能极大提升项目管理效率。核心原则:

  1. target_* 命令管理依赖(现代方式)。
  2. 源码与构建分离。
  3. 明确指定 C++ 标准。
  4. 多用变量和函数提高可维护性。

如果你有具体需求(如集成 Qt、生成 VS 项目、交叉编译、单元测试等),欢迎继续提问,我可以提供针对性的示例!

文章已创建 3511

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部