CMake基础入门 📅 2026/7/2 8:03:34 1CMake核心认识1CMake的定位CMake是跨平台的构建系统生成工具它不直接编译代码而是根据配置文件CMakeLists.txt自动生成对应平台的构建配置(Linux下的MakefileWindows下的Visual Studio工程macOS下的Xcode工程等)再调用原生构建工具完成编译。通俗类比传统手写 Makefile 手工雕刻月饼模具每个平台都要重新制作CMake 自动生成模具的机器写一次配置所有平台都能生成对应的构建文件2CMake核心优势优势传统方式CMake 方式改进效果跨平台构建人工编写各平台 Makefile / 工程文件自动生成对应平台构建配置一处配置到处构建学习成本Makefile 语法复杂平台差异大语法简洁统一表达能力强大幅降低学习成本提升开发效率依赖管理手动查找第三方库路径自动查找、配置依赖包包管理标准化IDE 兼容性每个 IDE 有独立的工程格式主流 IDE 原生支持 CMake一处配置多 IDE 通用3主流IDE支持情况目前 C/C 主流开发环境均原生支持 CMakeCMake 已经成为 C/C 领域事实上的工程构建标准IDE厂商类型核心特点Visual Studio微软免费 / 付费Windows 平台最强 C 开发工具原生集成 CMakeVisual Studio Code微软免费轻量编辑器通过插件支持 CMake跨平台首选CLionJetBrains付费智能代码分析CMake 深度集成跨平台体验优秀CursorAnysphere付费AI 原生编辑器兼容 VS Code 的 CMake 插件生态2环境配置1CMake安装1Ubuntu/Debian系统# 更新源并安装 sudo apt update sudo apt install cmake # 验证安装与版本 cmake --version各 Linux 发行版预装 CMake 参考Linux 发行版版本预装 CMake 版本Ubuntu LTS22.04 (Jammy)3.22通过 apt 安装Ubuntu LTS24.04 (Noble)3.28Debian12 (Bookworm)3.22Fedora393.28CentOS Stream93.222其他环境安装Windows从 CMake 官网下载安装包安装时勾选「Add CMake to system PATH」macOS通过 Homebrew 安装brew install cmake源码编译安装适合需要特定版本的场景从 cmake.org 下载源码后编译安装2VS Code CMake插件推荐安装 4 个核心插件覆盖语法、构建、智能提示全流程CMake基础语法高亮CMake Tools核心构建插件提供可视化的配置、编译、调试按钮CMake Language Support更完善的语法补全与代码片段CMake IntelliSense智能语义提示与错误检查插件核心价值语法高亮与代码补全减少手写配置的错误实时语法检查提前发现配置问题可视化按钮替代命令行操作提升开发效率3第一个CMake工程Hello World1目录结构hello_world/ ├── CMakeLists.txt # CMake 配置文件文件名固定不能修改 └── main.cpp # 源代码文件2编写源代码main.cpp#include iostream int main() { std::cout hello world! std::endl; return 0; }3编写CMakeLists.txt最简配置只需要 3 行核心代码# 1. 指定最低 CMake 版本要求 cmake_minimum_required(VERSION 3.18) # 2. 设置项目名称 project(helloWorld) # 3. 添加可执行文件构建目标 add_executable(main main.cpp)逐行解释cmake_minimum_required(VERSION 3.18)作用配置阶段检查当前 CMake 版本低于要求则直接报错终止意义CMake 版本迭代会引入新语法设置最低版本可以避免因版本过低导致的未知错误位置必须放在顶级 CMakeLists.txt 的第一行project(helloWorld)作用定义项目名称执行后会自动生成PROJECT_NAME等内置变量位置通常放在第二行顶级配置文件中调用一次即可add_executable(main main.cpp)作用告诉 CMake 要从main.cpp生成一个名为main的可执行文件核心概念目标Target目标是 CMake 最核心的概念之一代表一个要生成的实体可执行文件、静态库、动态库等后续所有编译选项、依赖、头文件路径都是挂载在「目标」上进行配置4构建和运行推荐源外构建# 1. 创建独立的构建目录并进入 mkdir build cd build # 2. 配置项目生成 Makefile.. 表示源文件目录在上一级 cmake .. # 3. 编译链接 make # 4. 运行程序 ./main源内构建 vs 源外构建源内构建直接在源码目录执行cmake .生成的中间文件和源码混在一起源外构建单独建 build 目录存放所有生成文件源码目录保持干净为什么推荐源外构建不污染源码目录便于版本管理Git 只需要忽略 build 目录可以同时存在多个构建目录比如 Debug 和 Release 分开构建清理构建产物简单直接删除 build 文件夹即可5构建流程原理整个过程分为两步配置生成阶段执行cmake ..解析 CMakeLists.txt生成对应平台的构建文件Linux 下是 Makefile编译链接阶段执行make调用编译器完成代码编译、链接生成最终可执行文件4CMake完整命令工作流一个完整的 C/C 工程构建生命周期包含配置 → 编译 → 测试 → 安装 → 打包CMake 提供了全套命令行工具覆盖全流程。1全流程命令总览# 1. 创建构建目录 mkdir build cd build # 2. 配置项目生成构建文件 cmake .. # 或显式指定源码和构建目录推荐写法更清晰 cmake -S .. -B . # 3. 编译构建 cmake --build . # 或 Linux 下直接调用 make make # 4. 执行测试需配置 CTest ctest . # 或 make test # 5. 安装项目需配置 install cmake --install . # 或 make install # 6. 打包分发需配置 CPack cpack # 或 make package2核心命令讲解1配置阶段cmake生成构建系统常用参数-S path指定源码根目录必须包含顶级 CMakeLists.txt-B path指定构建目录所有中间文件和最终产物都生成在这里三个目录树概念源码树Source Tree存放源代码的目录由 CMakeLists.txt 标识根目录构建树Build Tree存放编译中间文件和产物的目录由 CMakeCache.txt 标识安装树Install Tree执行 install 后文件部署的目录Linux 默认是/usr/local2编译阶段cmake --build优势跨平台统一命令Windows 下自动调用 MSBuildLinux 下自动调用 make/ninja不用记不同平台的构建命令常用参数--config Release/Debug指定构建类型多配置生成器如 VS 适用-j N开启 N 线程并行编译加快速度-v显示详细编译命令便于调试3安装阶段cmake --install作用将编译好的二进制、库文件、头文件复制到系统标准路径好处安装到标准路径后其他程序可以直接找到并链接该库不用手动指定路径Linux 默认安装前缀CMAKE_INSTALL_PREFIX /usr/local可执行文件 →/usr/local/bin库文件 →/usr/local/lib头文件 →/usr/local/include4脚本模式和命令模式脚本模式cmake -P script.cmake不生成构建文件直接执行 CMake 脚本适合做环境检查、文件处理、自动化部署等任务例子安装过程内部就是通过脚本模式执行文件拷贝命令模式cmake -E command提供跨平台的通用命令比如文件删除、复制、创建目录、echo 等常见用法cmake -E rm -f 文件、cmake -E make_directory 目录意义替代系统原生命令保证跨平台一致性、5可执行文件的完整工程编译安装我们做一个更完整的工程实现可执行文件的编译、版本管理、系统安装。1目录结构install_hello/ ├── CMakeLists.txt ├── build/ └── main.cpp2完整CMakeLists.txt# 1. 最低版本要求 cmake_minimum_required(VERSION 3.18) # 2. 项目配置带版本号、指定语言 project(InstallHello VERSION 1.2.3 LANGUAGES C CXX ) # 3. 添加可执行目标 add_executable(hello main.cpp) # 4. 引入 GNU 安装目录标准 include(GNUInstallDirs) # 5. 配置安装规则 install(TARGETS hello) # 调试打印 message(STATUS 项目名称: ${PROJECT_NAME}) message(STATUS 项目版本: ${PROJECT_VERSION}) message(STATUS 主版本号: ${PROJECT_VERSION_MAJOR}) message(STATUS 次版本号: ${PROJECT_VERSION_MINOR}) message(STATUS 修订号: ${PROJECT_VERSION_PATCH}) message(STATUS 默认安装前缀: ${CMAKE_INSTALL_PREFIX}) message(STATUS 可执行文件安装目录: ${CMAKE_INSTALL_BINDIR})3核心知识1project命令完整形式project(项目名 [VERSION 主版本.次版本.修订号] [DESCRIPTION 项目描述] [LANGUAGES 支持的语言] )执行后自动生成的常用内置变量PROJECT_NAME项目名称PROJECT_VERSION完整版本号PROJECT_VERSION_MAJOR/MINOR/PATCH各级版本号PROJECT_SOURCE_DIR项目源码根目录PROJECT_BINARY_DIR项目构建根目录2GNUInstallDirs作用定义了符合 GNU 标准的安装目录命名保证不同项目安装路径统一核心变量CMAKE_INSTALL_BINDIR可执行文件目录默认binCMAKE_INSTALL_LIBDIR库文件目录默认libCMAKE_INSTALL_INCLUDEDIR头文件目录默认include3install命令基础形式install(TARGETS 目标名)作用定义目标的安装规则执行cmake --install时生效不指定路径时自动根据目标类型安装到 GNUInstallDirs 定义的标准目录4message命令用于打印调试信息常用级别STATUS普通状态信息前缀带--WARNING警告信息不终止配置FATAL_ERROR致命错误直接终止配置流程4完整操作流程# 1. 进入构建目录 mkdir build cd build # 2. 配置项目观察打印的变量信息 cmake .. # 3. 编译 cmake --build . # 4. 运行本地程序 ./hello # 5. 安装到系统需要管理员权限 sudo cmake --install . # 6. 全局运行因为安装到了 /usr/local/bin在 PATH 里 hello5自定义安装路径如果不想安装到系统目录可以在配置时指定安装前缀# 指定安装到当前目录下的 install 文件夹 cmake .. -DCMAKE_INSTALL_PREFIX./install