Cmake tutorial

under default category  tag     Published on March 13th , 2026 at 05:17 pm

tutorial

0. 什么是 CMake

CMake 不是编译器。
它用 CMakeLists.txt 生成构建系统(Makefile / Ninja / Xcode / VS 工程),然后再去编译你的 C/C++ 项目。

1. 什么时候用到 CMake

当你不想再手写又臭又长的 g++/clang++ 编译命令时用它,尤其是:

  • 源码文件变多、编译顺序/依赖变复杂
  • 想跨平台(mac / linux / windows)
  • 想统一管理:include 路径、编译选项、链接库、Debug/Release

2. CMake 安装

2.1 macOS(Homebrew)

brew install cmake
cmake --version

2.2 Linux(Ubuntu/Debian)

sudo apt-get update
sudo apt-get install cmake
cmake --version

2.3 Windows

- 官网安装 CMake(安装时勾选加入 PATH)
- PowerShell 验证:cmake --version

3. CMake 怎么用

主要就是会写CMakeLists.txt , 然后运行三条构建命令即可。

3.1 项目结构

.
├── CMakeLists.txt
├── build/          # 构建产物(自动生成)
├── include/        # 头文件
└── src/            # 源码

3.2 最简单CmakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(Calculator)

set(CMAKE_CXX_STANDARD 11)

add_executable(calculator
    src/add.cpp
    src/sub.cpp
    src/mult.cpp
    src/div.cpp
    src/main.cpp
)

target_include_directories(calculator PRIVATE include)

3.3 构建及运行

在主目录下运行
# 1) 生成构建文件(configure)
cmake -S . -B build

# 2) 编译(build)
cmake --build build

# 3) 运行(run)
./build/calculator

3.4 日常开发须知

1. 改了.cpp/.h
       需 回到2)
           cmake --build build
       
2. 改了CMakeLists.txt 或新增/删除源码文件
       需 回到1)
           cmake -S . -B build  
           cmake --build build

4. 库 + 可执行文件

4.1 为什么拆成库+可执行文件

  • 库(library):放运算逻辑(add/sub/mult/div),方便复用
  • 可执行文件(executable):放 main.cpp,只负责入口/打印/交互
  • 编译流程变成:先编译库 → 再编译 main → 最后 link 成可执行文件

    4.2 库 + 可执行文件版 CMakeLists.txt

两个target:

  • calculator_lib:库 target
  • calculator:可执行 target

    cmake_minimum_required(VERSION 3.10)  
    project(Calculator LANGUAGES CXX)  
    
    set(CMAKE_CXX_STANDARD 11)  
    set(CMAKE_CXX_STANDARD_REQUIRED ON)  
    
    # 1) 库:运算逻辑  
    add_library(calculator_lib
      src/add.cpp
      src/sub.cpp
      src/mult.cpp
      src/div.cpp
    )
    # 库公开 include/,让使用库的人自动继承头文件路径  
    target_include_directories(calculator_lib PUBLIC include)  
    
    # 2) 可执行文件:入口 main  
    add_executable(calculator  
      src/main.cpp  
    )  
    
    # 3) 可执行文件链接库  
    target_link_libraries(calculator PRIVATE calculator_lib)

5.PUBLIC / PRIVATE / INTERFACE

这三个词用来定义target之间的依赖时,要不要传递被依赖者用到的使用要求

  • PRIVATE:只给当前 target 用,不传给依赖它的 target
  • PUBLIC:当前 target 用,并且传给依赖它的 target
  • INTERFACE:当前 target 自己不用,只传给依赖它的 target
  • A PRIVATE B:A 链接 B;B 的使用要求不会通过 A 再传给 A 的下游
  • A PUBLIC B:A 链接 B;B 的使用要求会通过 A 传给 A 的下游
  • A INTERFACE B:A 自己不参与编译/链接实现;只把依赖/使用要求传给下游

可执行文件链接库一般用 PRIVATE;库链接库才经常需要 PUBLIC/INTERFACE

6. Debug / Release

Debug 和 Release 是两种构建配置:

  • Debug:用于调试(带调试信息,优化少)
  • Release:用于性能(优化多,调试不方便)
  • 平时开发:用 build-debug/
  • 要性能/最终版:用 build-release/

    6.1 Debug 构建并运行

cmake -S . -B build-debug -DCMAKE_BUILD_TYPE=Debug  
cmake --build build-debug  
./build-debug/calculator

6.2 Release 构建并运行

cmake -S . -B build-release -DCMAKE_BUILD_TYPE=Release  
cmake --build build-release  
./build-release/calculator

6.3 如何确认当前是 Debug / Release

grep CMAKE_BUILD_TYPE build-debug/CMakeCache.txt  
grep CMAKE_BUILD_TYPE build-release/CMakeCache.txt

本文由 Ale 创作,采用 知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:March 13th , 2026 at 09:17 am
分享到:Twitter  Weibo  Facebook