当前位置: 首页 > news >正文

CMake基础:覆盖项目开发的五大配套工具

目录

1.CMake的五大配套工具

2.cmake

3.ccmake

4.cmake-gui

5.ctest

6.cpack

7.总结

相关链接


1.CMake的五大配套工具

CMake实践:安装与配置

安装CMake后,以windows为例,在bin目录下就有五大配套工具:

在 文件夹中,cmakeccmakecmake-guictestcpack 是一系列配套工具,分别负责配置构建交互式配置图形化配置测试打包等环节,共同覆盖了从项目配置到最终分发的全流程。下面就来讲讲几个配套工具的功能。

2.cmake

核心命令行工具,CMake 的 “引擎”, 非常重要。

  • 主要作用:解析项目根目录下的 CMakeLists.txt,根据当前系统环境(如操作系统、编译器)生成对应的构建系统文件(如 Makefile、Ninja 脚本、Visual Studio 项目、Xcode 工程等)。
  • 工作流程:通过命令行指定源码目录(-S)和构建目录(-B),自动处理跨平台适配、依赖管理、编译选项等逻辑,生成可直接用于编译的构建文件。

示例

cmake -S ./src -B ./build  # 从 ./src 解析 CMakeLists,在 ./build 生成 Makefile
cd build && make           # 用生成的 Makefile 编译项目
  • 特点:非交互式,适合脚本、自动化流程(如 CI/CD),是最基础、最常用的 CMake 工具。

3.ccmake

curses 风格的交互式配置工具

  • 主要作用:提供终端内的交互式界面,允许用户可视化修改 CMake 变量(如 CMAKE_BUILD_TYPECMAKE_INSTALL_PREFIX、自定义编译选项等),并实时生成构建系统。
  • 适用场景:当需要调整 CMake 变量(如开启 / 关闭某个功能、设置依赖路径)但不想手动编辑 CMakeLists.txt 或命令行参数时使用,尤其适合没有图形界面的环境(如服务器、终端)。
  • 使用流程
ccmake -S ./src -B ./build  # 启动交互式界面
# 在界面中通过方向键导航,按 Enter 修改变量(如将 CMAKE_BUILD_TYPE 设为 Release)
# 按 'c' 配置(configure),按 'g' 生成(generate)并退出
  • 特点:终端交互式,比纯命令行 cmake 更直观地管理变量,但依赖 curses 库(需系统支持)。

在 Windows 系统上使用 ccmake(CMake 的终端交互式配置工具)需要进行一些额外配置,因为 Windows 默认不支持类似 Linux/macOS 的 curses 终端界面。可通过一下方法来使用:

方法一:使用 Windows Subsystem for Linux (WSL)

推荐方案:通过 WSL 在 Windows 中运行 Linux 环境,完全兼容 ccmake

1.启用 WSL

打开 PowerShell(管理员权限),执行:

wsl --install  # 安装默认 Linux 发行版(Ubuntu)

按提示重启系统,完成安装。

2.在 WSL 中安装 CMake

打开 WSL 终端(如 Ubuntu),执行:

3.使用 ccmake

  • 将项目源码放在 WSL 可访问的路径(如 ~/projects/myproject);
  • 在 WSL 终端中进入项目目录,执行:
mkdir build && cd build
ccmake ..  # 启动交互式配置界面

方法二:使用 MinGW/MSYS2 环境

在 Windows 原生环境中模拟 Unix 终端,提供 curses 支持。

1.安装 MSYS2

从 MSYS2 官网 下载安装程序,按提示完成安装。

2.安装 CMake 和依赖

打开 MSYS2 MinGW 64-bit 终端,执行:

pacman -Syu  # 更新系统
pacman -S cmake ncurses  # 安装 CMake 和 ncurses 库

3.使用 ccmake

在 MSYS2 终端中进入项目目录,执行:

mkdir build && cd build
ccmake ..  # 在 MSYS2 终端中启动交互式界面

4.cmake-gui

图形化配置工具

  • 主要作用:提供可视化窗口界面,功能与 ccmake 类似,但通过图形界面操作,更适合习惯鼠标交互的用户(如 Windows、macOS 桌面环境)。
  • 核心功能
    • 可视化选择源码目录(Where is the source code)和构建目录(Where to build the binaries);
    • 在窗口中直接编辑 CMake 变量(如勾选 BUILD_SHARED_LIBS 生成动态库);
    • 点击 “Configure” 生成临时配置,点击 “Generate” 生成最终构建系统文件。
  • 适用场景:对命令行不熟悉的用户,或需要频繁调整复杂变量(如多路径依赖、条件编译选项)时,图形界面更易操作。

5.ctest

CMake 自带的测试工具

  • 主要作用:运行项目中通过 add_test() 定义的测试用例,自动执行测试并生成报告,支持并行测试、过滤测试、生成 XML 格式结果等。
  • 工作流程
    1. 在 CMakeLists.txt 中通过 add_test(NAME <name> COMMAND <exe> [args]) 定义测试;
    2. 编译项目后,在构建目录中运行 ctest 执行所有测试(或通过 -R <regex> 过滤特定测试)。
  • 示例
cd build          # 进入构建目录(已生成测试目标)
ctest -j4         # 并行 4 个进程执行所有测试
ctest -R "unit_*" # 只执行名称匹配 "unit_*" 的测试
ctest --output-on-failure  # 测试失败时输出详细日志
  • 特点:与 CMake 无缝集成,无需额外配置测试框架(但可配合 Google Test、Catch2 等框架使用),是自动化测试的核心工具。

6.cpack

打包与分发工具

  • 主要作用:根据项目的安装配置(通过 install() 命令定义),生成跨平台的安装包 / 分发文件(如 .tar.gz.zip、Debian 包 .deb、RPM 包 .rpm、Windows 安装程序 .msi 等)。
  • 工作流程
    1. 在 CMakeLists.txt 中通过 install(TARGETS ...) 定义安装路径(如可执行文件、库、头文件的安装位置);
    2. 生成构建系统并编译后,在构建目录中运行 cpack,根据配置生成对应格式的安装包。
  • 示例
cd build          # 进入构建目录
make install      # 先执行安装(可选,cpack 可自动处理)
cpack -G ZIP      # 生成 ZIP 格式的压缩包
cpack -G DEB      # 生成 Debian 包(需系统支持 dpkg)
  • 特点:支持多种打包格式,可通过 CPack 相关变量(如 CPACK_PACKAGE_NAMECPACK_VERSION)定制包信息,简化项目分发流程。

7.总结

这五个工具分工明确,覆盖了 CMake 项目的全生命周期:

  • cmake:核心生成工具,负责从 CMakeLists.txt 生成构建系统;
  • ccmake/cmake-gui:辅助配置工具,分别提供终端 / 图形化界面调整 CMake 变量;
  • ctest:专注测试,执行项目测试用例并生成报告;
  • cpack:专注打包,将编译产物封装为可分发的安装包。

它们共同构成了 CMake 从 “配置 - 生成 - 编译 - 测试 - 打包” 的完整生态。

相关链接

  • CMake 官网 CMake - Upgrade Your Software Build System
  • CMake 官方文档:CMake Tutorial — CMake 4.1.0-rc2 Documentation
  • CMake 源码:https://github.com/Kitware/CMake
  • CMake 源码:CMake · GitLab
  • 中文版基础介绍: CMake 入门实战 | HaHack
  • wiki: Home · Wiki · CMake / Community · GitLab
  • Modern CMake 简体中文版: Introduction · Modern CMake
http://www.lryc.cn/news/588583.html

相关文章:

  • 【机器学习深度学习】大模型推理速度与私有化部署的价值分析
  • ELK部署与使用详解
  • Docker部署语音转文字(STT)服务并接入Home Assistant
  • Dubbo高阶难题:异步转同步调用链上全局透传参数的丢失问题
  • 设备发出、接收数据帧的工作机制
  • HarmonyOS从入门到精通:动画设计与实现之九 - 实用动画案例详解(上)
  • HarmonyOS从入门到精通:动画设计与实现之九 - 实用动画案例详解(下)
  • 暑假Python基础整理 -- 文件及目录操作
  • keepalive模拟操作部署
  • 2025-7-14-C++ 学习 排序(2)
  • IoC容器深度解析:架构、原理与实现
  • 驱动开发系列60- Vulkan 驱动实现-SPIRV到HW指令的实现过程(1)
  • 分支战略论:Git版本森林中的生存法则
  • PHP password_verify() 函数
  • 什么是微服务?-核心思想:化整为零,各自为战
  • Node.js + Express的数据库AB View切换方案设计
  • 【EM算法】三硬币模型
  • 自动微分模块
  • Class9简洁实现
  • JavaScript进阶篇——第二章 高级特性核心
  • JavaScript进阶篇——第一章 作用域与垃圾回收机制
  • 力扣 hot100 Day44
  • java基础(day07)
  • 板凳-------Mysql cookbook学习 (十一--------10)
  • 06【C++ 初阶】类和对象(上篇) --- 初步理解/使用类
  • ThreadLocal内部结构深度解析
  • 《大数据技术原理与应用》实验报告三 熟悉HBase常用操作
  • 每天一个前端小知识 Day 31 - 前端国际化(i18n)与本地化(l10n)实战方案
  • html js express 连接数据库mysql
  • Java:继承和多态(必会知识点整理)