简介:CMake 3.29.7 官方 Windows 绿色版压缩包,面向需要在 Windows 平台配置 C++ 构建环境的开发者与运维人员。该版本采用免安装形式,解压后将 bin 目录加入系统 PATH 变量即可直接调用 cmake 命令,无需安装程序或修改注册表,便于本地编译、跨平台项目构建、自动化脚本以及 CI 环境快速部署,也可拷贝到多台机器离线使用。包内共收录 2000 个文件,以 1157 个 txt 说明文档和 843 个 html 帮助页面为主,内容覆盖 cmake 与 ctest 命令行工具说明、生成器表达式、预设文件、构建系统、变量与文件 API 等官方技术资料,适合离线查阅。压缩包整体约 43.63 MB,体积小巧、目录组织清晰,下载与分发成本低。目前已有 610 人学习,初学 CMake 的开发者可借此掌握编译配置方法,中高级用户也能在日常开发中快速定位命令参数或构建语法。
1. cmake-3.29.7-windows-x86-64.zip:绿色包三分钟跑通,安装包可以退场了
做 Windows 下 C++ 开发的人,装 CMake 多半是从官网下安装包一路 Next。实际用下来,安装包写注册表、要管理员权限、卸载还留残留,给新同事搭环境来回折腾。cmake-3.29.7-windows-x86-64.zip 是官方绿色免安装包,把整个流程压缩成解压、加 PATH、验证版本三步,不写注册表、不用管理员权限,换版本直接删目录。
zip 里除了 cmake.exe、cmake-gui.exe,还自带与 3.29.7 严格对应的整套 HTML 离线手册,适合新机器快速搭环境、CI 免安装调用、多版本共存这三类场景。下面从解压配置讲到实际构建 C++ 项目,再讲 Windows 上容易翻车的点。
2. 解压配置:PATH 加对地方,cmake 与 cmake-gui 双双跑起来
拿到 zip 之后别急着双击解压到桌面。在 Windows 上做开发,工具链的目录组织直接影响后续维护。我一般先建一个专门放工具的地方,比如 D:\tools,把 zip 解压进去,重装系统或换机器时整个目录拷走就行,不用重新走安装流程。
2.1 目录里到底装了什么
解压完成后,你会看到一个带完整版本号的根目录,这是官方 zip 的固定结构:
D:\tools\cmake\ └── cmake-3.29.7-windows-x86-64\ ├── bin\ │ ├── cmake.exe # 命令行主程序 │ ├── cmake-gui.exe # 图形界面 │ ├── cpack.exe # 打包工具 │ └── ctest.exe # 测试工具 ├── doc\ │ └── cmake-3.29\ # 离线 HTML 手册 │ ├── index.html │ ├── cmake-buildsystem.7.html │ ├── cmake-generator-expressions.7.html │ ├── cmake-presets.7.html │ └── ... └── share\ └── cmake-3.29\ # 模块与模板,运行时自用bin 下四个 exe 是日常主干:cmake 负责配置和构建,cmake-gui 提供图形界面便于观察缓存变量,ctest 跑测试,cpack 打安装包。doc 下的 HTML 文档是这份 zip 最大的附加值,第 3 章专门讲怎么用。share 里是 CMake 自带的模块和编译器探测模板,运行时自己引用,不需要手动改动。
这里有个值得养成的习惯:保留这个带版本号的根目录,不要把 bin 直接铺开到 D:\tools 下。这样同一时刻可以存在 cmake-3.29.7-windows-x86-64 和 cmake-3.28.x-windows-x86-64 两个目录,靠 PATH 顺序或完整路径切换版本,改起来只动一个环境变量值。我见过不少同事图省事把 bin 提出来,最后多版本切换时只能反复改名,非常被动。
注意:解压路径尽量避开中文和过深的目录层级。CMake 3.29 对中文路径的兼容性比老版本好,但 Visual Studio 的智能感知和 MinGW 的 make 工具对非 ASCII 路径支持参差不齐,不值得赌这个概率。
2.2 用户级 PATH 还是系统级 PATH
PATH 加在哪里直接影响权限和影响范围。个人开发机我建议加用户级 PATH,不加系统级,这样不会影响这台机器上的其他账户,也不触发 UAC 弹窗,出问题时只需要改自己的环境变量。
用 PowerShell 执行用户级写入:
$cmakeBin = "D:\tools\cmake\cmake-3.29.7-windows-x86-64\bin" $userPath = [Environment]::GetEnvironmentVariable("Path", "User") if ($userPath -notlike "*cmake-3.29.7*") { [Environment]::SetEnvironmentVariable("Path", $userPath + ";" + $cmakeBin, "User") }这段代码的逻辑是:先读出当前用户级 PATH,判断是否已经包含目标目录,避免反复执行脚本导致 PATH 里堆出好几条重复项。SetEnvironmentVariable 第三个参数取 User,写入的是注册表 HKEY_CURRENT_USER\Environment,当前用户的所有新进程都会读到。
CI 机器或多人共用的编译服务器上,改用系统级 PATH。命令几乎一样,只是把最后一个参数换成 Machine:
$cmakeBin = "D:\tools\cmake\cmake-3.29.7-windows-x86-64\bin" [Environment]::SetEnvironmentVariable("Path", $env:Path + ";" + $cmakeBin, "Machine")参数说明:User 作用域写入无需管理员权限;Machine 作用域写入注册表 HKEY_LOCAL_MACHINE,必须在管理员权限的 PowerShell 里执行,否则会报拒绝访问。习惯界面操作的,在「系统属性 → 环境变量」里追加同样有效,我偏好命令行是因为可以写进初始化脚本,新机器上跑一遍就完成全部配置。
2.3 验证三件套:版本号、GUI、配套工具
PATH 改完后,当前打开的终端不会自动感知新环境变量。这是 Windows 上几乎所有命令行工具配完环境后的第一处翻车点——不是工具没装好,而是终端会话里的 Path 快照还是旧的。
开一个新的 PowerShell 窗口,验证版本:
cmake --version # 期望输出:cmake version 3.29.7如果实在不想关当前终端,可以用一行命令手动刷新会话里的 PATH:
$env:Path = [Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [Environment]::GetEnvironmentVariable("Path", "User")刷新后再跑 cmake --version。顺带把 ctest 和 cpack 也验一下,这两个工具经常被漏掉:
ctest --version cpack --version接着启动图形界面。很多人以为 cmake 只有命令行,其实官方一直提供 cmake-gui,配置缓存变量、观察生成器选项比命令行直观得多:
cmake-gui窗口能正常弹出就说明 GUI 完整。到这一步环境已经可用,整个过程从解压算起不超过三分钟。这套验证流程我每次换机器都会完整走一遍,别省 ctest 和 cpack 那两条,见过不止一次 bin 目录缺文件导致后面测试环节突然挂掉的。
3. 离线手册实战:zip 自带的 HTML 文档与命令行速查
网上 cmake 使用教程一搜一大把,但遇到具体问题时,版本对不上、写法过时的情况很常见。这份 zip 里最有价值的部分往往被忽略:doc 目录下整套与 3.29.7 严格对应的官方 HTML 手册,离线状态下比任何博客都靠谱。
3.1 手册构成:哪些页面解决哪些问题
doc\cmake-3.29 目录下核心手册和用途如下:
| 文件 | 内容 | 什么时候翻它 |
|---|---|---|
| cmake.1.html | 命令行全部参数 | 记不清 --build 和 --install 的用法时 |
| cmake-buildsystem.7.html | 构建系统概念 | 搞不清 target、目录属性、依赖传递时 |
| cmake-generator-expressions.7.html | 生成器表达式全解 | 写条件编译、平台分支时 |
| cmake-presets.7.html | CMakePresets.json 规范 | 配 IDE 与 CI 共用配置时 |
| cmake-variables.7.html | 内置变量索引 | 查 CMAKE_BUILD_TYPE 等变量语义时 |
| cmake-file-api.7.html | File API 规范 | 研究 IDE 的 CMake 集成时 |
| ctest.1.html | CTest 手册 | 配测试目标时 |
index.html 是总入口,genindex.html 是按字母排序的主题索引。整套页面合在一起就是一个小型官方文档站。
Windows 下直接双击打开:
start "" "D:\tools\cmake\cmake-3.29.7-windows-x86-64\doc\cmake-3.29\index.html"如果喜欢像查本地网站一样用浏览器扫索引,也可以用 Python 起一个本地服务,把整个 doc 目录挂到本机端口上,局域网内其他机器也能访问:
python -m http.server 8765 --directory "D:\tools\cmake\cmake-3.29.7-windows-x86-64\doc\cmake-3.29"参数说明:--directory 指定站点根目录,这样 Chrome 里打开 http://127.0.0.1:8765 就是手册首页,搜索和跳转比 file:// 协议顺滑。这套文档的版本号严格对应 3.29.7,不会出现「网上教程讲的是 3.16、你却在用 3.29」的错位问题,这是它最大的价值。
3.2 命令行速查:--help 系列的正确打开方式
懒得开浏览器时,cmake 自带一套纯文本帮助,直接在终端里查:
cmake --help-command add_executable cmake --help-variable CMAKE_BUILD_TYPE cmake --help-module FindOpenGL cmake --help-manual cmake-generator-expressions逻辑说明:--help-command 接的是命令名,比如 add_executable、target_link_libraries;--help-variable 接变量名,输出会告诉你 CMAKE_BUILD_TYPE 的取值和生效范围;--help-module 接 find 模块名;--help-manual 接手册名,把后面的 .7.html 去掉就行。
这套帮助输出纯文本,适合在终端里快速确认写法,不用在 HTML 和 IDE 之间来回切。Windows 终端过滤输出不能像 Linux 那样用 grep,得用 findstr,比如查生成器表达式里的 CONFIG 关键字:
cmake --help-manual cmake-generator-expressions | findstr /i "CONFIG:"findstr 的 /i 表示忽略大小写。装了 Git Bash 的可以直接 grep,Windows 原生 CMD 和 PowerShell 里就用 findstr。
3.3 实战:生成器表达式看不懂时这么查
写一个真实场景。项目要同时在 Visual Studio 和 MinGW 下编译,Debug 配置两边都开调试信息,但参数不同:
target_compile_options(app PRIVATE $<$<CONFIG:Debug>:$<$<CXX_COMPILER_ID:MSVC>:/Od>> $<$<CONFIG:Debug>:$<$<CXX_COMPILER_ID:GNU>:-g>> )第一次看到这串 $<...> 的人基本都蒙,觉得像玄学。实际上它是生成器表达式,在 configure 完成后的 generate 阶段才会被求值。所以你会发现一个特点:不能把它放进 if() 里做流程控制,因为 if() 在 configure 阶段执行时,生成器表达式还没被解析。
去 cmake-generator-expressions.7.html 一查就清楚:$ CONFIG:cfg 的语义是「当构建配置名是 Debug 时结果为 1,否则为 0」;$<CXX_COMPILER_ID:GNU> 同理,判断编译器是不是 GCC 家族。外层写成 $<$ : > 是三元条件结构:第一个参数是条件,第二个是条件为真时展开的文本,条件为假展开空字符串。
参数说明里最容易写反的是嵌套顺序。上例我把 CONFIG 放在外、编译器 ID 放在内,含义是「先判断 Debug 配置,再细分编译器」。如果内外写反,MinGW 的 Release 包可能意外带上 -g 这类问题。查文档前我写过好几次反的,现在凡是涉及多层嵌套,都会先翻一页手册确认求值顺序再落笔。
4. 构建 C++ 项目:MSVC 与 MinGW 的生成器参数选型与实测
环境配好了,文档也知道了去哪查,接下来是正事:把一个 C++ 项目真正构建出来。这里核心变量只有一个:生成器。
4.1 为什么生成器要显式指定
CMake 在 Windows 上的默认行为依赖机器现状。装了 Visual Studio 时,默认用 VS 生成器生成 .sln;机器上没有 VS、只有 MinGW 时,直接 configure 会报错说找不到编译器。所以第一步就是明确当前机器上到底走哪条路。
两套环境分别这么配:
# 机器装了 VS 2022 cmake -S . -B build -G "Visual Studio 17 2022" -A x64 # 机器只有 MinGW cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release选型直接决定后面所有行为,这是两类生成器最本质的差异:Visual Studio 生成器是「多配置」的,Debug 和 Release 不是 configure 时定的,而是构建时用 --config 指定;MinGW Makefiles 是「单配置」的,必须在 configure 时通过 CMAKE_BUILD_TYPE 定死。很多从 Linux 转过来的朋友在这里栽过跟头——在 VS 生成器下写 -DCMAKE_BUILD_TYPE=Release 是无效的。
装了 Ninja 的还可以用 -G "Ninja"。Ninja 和 MinGW Makefiles 一样是单配置生成器,速度更快,错误输出对工具友好。Ninja 本身要单独下载,CMake 不会帮你装。
下载 zip 时也要注意架构。这个包是 x86-64 后缀,对应 64 位 CMake。同样命名规则下存在 32 位版本,如果 64 位机器上意外用了 32 位 CMake,配合 64 位工具链时会出现架构不匹配的怪问题,排查成本比想象高。
4.2 一个最小 C++ 项目完整跑通
建一个 demo 目录,放两个文件。CMakeLists.txt:
cmake_minimum_required(VERSION 3.20) project(demo LANGUAGES CXX) add_executable(demo main.cpp) if(MSVC) target_compile_options(demo PRIVATE /W4) else() target_compile_options(demo PRIVATE -Wall) endif()main.cpp:
#include <iostream> int main() { std::cout << "cmake 3.29.7 windows build ok" << std::endl; return 0; }MinGW 环境下配置并构建:
cmake -S demo -B demo/build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release cmake --build demo/build .\demo\build\demo.exe第一行执行后,重点看输出里的两行:-- The C compiler identification is GNU XX.X.X和-- The CXX compiler identification is GNU XX.X.X。如果出现的是 MSVC 相关字样,说明 CMake 找到了 Visual Studio 而不是 MinGW,多半是 PATH 里 VS 的环境脚本抢先了。第二行是实际编译,CMake 会找到构建目录里的 Makefile 并调用 mingw32-make。
Visual Studio 环境下:
cmake -S demo -B demo/build -G "Visual Studio 17 2022" -A x64 cmake --build demo/build --config Release .\demo\build\Release\demo.exe注意可执行文件的位置:VS 生成器下输出按照配置分目录,Release 在 build\Release,Debug 在 build\Debug;MinGW Makefiles 单配置生成器下直接输出在 build 根目录。找不找得到 exe,往往是新手第一个困惑点。构建成功后,用 Visual Studio 打开生成的 .sln 也可以直接点生成,效果一样。生成器决定的是构建系统形态,代码还是同一份,换生成器不需要改 CMakeLists.txt,除非里面写了生成器相关判断。
4.3 高频参数速查与 raylib/Qt 场景对照
日常构建最常用的参数整理成表:
| 参数 | 作用 | 适用生成器 |
|---|---|---|
| -DCMAKE_BUILD_TYPE=Release | configure 时指定配置 | 单配置(Makefiles/Ninja) |
| --config Release | 构建时指定配置 | 多配置(Visual Studio) |
| -DCMAKE_INSTALL_PREFIX=D:/env | 自定义安装前缀 | 全部 |
| -A x64 | 指定目标架构 | Visual Studio |
| -T v143 | 指定工具集版本 | Visual Studio |
| -DCMAKE_TOOLCHAIN_FILE=... | 指定交叉工具链文件 | 全部 |
这些参数换个场景照样通用。比如从 GitHub 拉 raylib 源码自己构建时,raylib 仓库本身就是 CMake 工程,MinGW 机器上直接套用上面的命令就能编出静态库。Qt 6 的 CMake 项目也是这套流程,唯一区别是 Qt 会提供一个工具链文件或 preset,用 -DCMAKE_TOOLCHAIN_FILE 或 --preset 指给 CMake,CMake 本体还是这份 zip。
3.29 的 presets 支持已经相当成熟。多配置项目可以直接用 -G "Visual Studio 17 2022" 配合 CMakePresets.json 里的 configurePresets 和 buildPresets,把架构和构建类型固化在仓库里,CI 和本地共用一份配置,离线文档 cmake-presets.7.html 里有完整 schema。
安装前缀我自己从来不用默认的 C:/Program Files,那会触发 UAC 弹窗。常见做法是在项目根目录下建一个 _install 目录,把 CMAKE_INSTALL_PREFIX 指到那里,验证完打包再统一挪到正式位置。
5. 避坑记录:Windows 上 CMake 环境常见的五个坑
下面五条都是我在 Windows 上实际踩过的血泪记录,每条按现象、原因、解决的顺序写,方便对照。
5.1 现象:新终端里 cmake 还是「不是内部或外部命令」
现象:配完 PATH 后,命令行执行 cmake --version,提示“不是内部或外部命令”。
原因:要么终端会话开得比环境变量修改早,会话里的 PATH 快照还是旧的;要么 PATH 里加进去的是解压根目录而不是 bin 目录,系统根本找不到 cmake.exe。
解决:先开全新终端再试。仍然不行就检查当前会话 PATH:
$env:Path -split ';' | Select-String 'cmake'确认输出里完整包含 ...\cmake-3.29.7-windows-x86-64\bin。再看实际调用哪个文件:
(Get-Command cmake).Source如果 Source 指向其他版本的 cmake,说明 PATH 里老目录排在前面,把新版本 bin 挪前或删掉旧目录即可。
5.2 现象:MinGW Makefiles 报错找不到编译器
现象:configure 时出现CMAKE_C_COMPILER not found,或直接提示找不到 gcc。
原因:MinGW 装了但 gcc 不在 PATH 里。CMake 探测编译器只走 PATH,不会自己扫描 MinGW 安装目录。
解决:先把 MinGW 的 bin 加进 PATH,跑 gcc --version 确认后重新 configure。注意 MinGW-w64 前缀目录下同时有 gcc.exe 和 g++.exe,两个都要在 PATH 里,CMake 才能同时识别 C 和 C++ 编译器。只加了 gcc 会出现 C 编译器找到、C++ 编译器找不到的半截状态。
5.3 现象:configure 过了,build 时中文路径报错
现象:CMake 配置顺利完成,build 阶段却在某个中间目录报错,错误信息里带中文路径。
原因:make 工具对非 ASCII 路径支持不统一。CMake 3.29 改善了解压路径的兼容,但 MSBuild 和 mingw32-make 对中文路径的容忍度有限,项目放在 C:\Users\中文名\project 下时更容易触发。
解决:源码目录和构建目录全部用纯英文路径。用户名是中文的老机器,不要把构建目录放 C:\Users\中文名 下面,直接指到 D:\build 这类根目录最省心。源码目录保留中文不一定每次都会炸,但没必要赌这个概率。
5.4 现象:程序编译通过,exe 跑起来提示缺 libstdc++-6.dll
现象:build 成功,命令行直接运行 exe 正常,但双击或在别的机器上运行时提示缺 libstdc++-6.dll。
原因:MinGW 的运行时 DLL 放在 MinGW 的 bin 目录下,exe 运行时不会自动去那里找。命令行能跑是因为终端里 MinGW 的 bin 已经在 PATH 中,而双击时系统按 exe 所在目录和系统 PATH 找 DLL。
解决:开发机上把 MinGW 的 bin 加进 PATH;分发 exe 时把 libstdc++-6.dll、libgcc_s_seh-1.dll、libwinpthread-1.dll 一并拷到 exe 同目录。想要单文件,就在 CMakeLists 里静态链:
target_link_options(demo PRIVATE -static-libgcc -static-libstdc++)代价是 exe 体积变大。我一般给内部小工具用静态链,正式产品还是按规范带动态库。
5.5 现象:改了 CMakeLists.txt,重新 build 还是旧行为
现象:改了 CMAKE_BUILD_TYPE 或换生成器后重新 configure,输出提示变量被缓存,构建行为没变化。
原因:构建目录下的 CMakeCache.txt 缓存了上一次 configure 的变量。CMake 发现同名缓存变量时会以缓存值为准,命令行新传的 -D 参数不一定会覆盖。
解决:改关键变量前删掉缓存文件或整个构建目录。习惯做法:
cmake -E remove_directory demo/build cmake -S demo -B demo/build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release第一行的 cmake -E 是 CMake 自带的文件操作命令,跨平台一致,比 Windows 原生的 del /s /q 可靠。从那以后我每次改动涉及生成器或构建类型的参数,都会先想清楚缓存要不要清,再执行 configure。
6. 进阶验证:多版本共存、缓存清理与完整性检查
6.1 安装完整性:哈希与目录结构双检查
下载完别急着解压,先算一下哈希:
Get-FileHash .\cmake-3.29.7-windows-x86-64.zip -Algorithm SHA256拿到 SHA256 后和官方发布页面或镜像站对比。如果没有可对比的哈希值,退一步做目录结构检查:bin 下四个 exe 一个不能少,doc 下 index.html 和那批手册必须在,share 下 cmake-3.29 目录不能为空。缺任何一项都说明包损坏或下载不完整,别硬装,重新下载更省时间。
6.2 多版本共存:路径切换而不动 PATH
同时维护多个项目、不同项目锁定不同 CMake 版本时,反复改 PATH 很蠢。目录并存,项目脚本里固定调用路径:
CMAKE_329 := D:\tools\cmake\cmake-3.29.7-windows-x86-64\bin\cmake.exe CMAKE_328 := D:\tools\cmake\cmake-3.28.0-windows-x86-64\bin\cmake.exe build: $(CMAKE_329) -S . -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release $(CMAKE_329) --build build这样每个项目锁死一个版本,不会因为全局升级 CMake 后某条命令行为变化导致项目重配。临时要切换,改一行变量就行。Linux 上离线安装 CMake 也是同一个思路,官方 tar.gz 包同样是解压后加 PATH,版本管理方式完全一致。
6.3 固定四步验证,把环境问题挡在开工前
最后分享一个习惯。刚开始用绿色包时我偷懒,解压完加完 PATH 就跑项目,结果有一次 CI 机器上 configure 通过了,build 却走了老版本缓存生成的中间文件,排查了半个下午。从那以后我每次在新机器上装 CMake 都强制走一遍固定四步:解压到工具目录、配置 PATH、cmake --version 验证、跑一次最小项目。三十秒的固定动作,换来的是后面几天不和环境纠缠。希望帮到你。
本文还有配套的精品资源,点击获取