
简介这是CMake官方在Windows x64平台上的绿色免安装压缩包版本为3.29.7适合需要快速配置构建环境的C开发者。无需执行安装程序解压后将bin目录加入系统环境变量即可通过cmake、ctest等命令运行便于多版本切换或在无管理员权限的机器上使用。压缩包内共约2000个文件其中1157个txt文件和843个html文件构成html部分对应官方文档页面涵盖生成器表达式、ctest用法、cmake-file-api、构建系统与预设机制等主题txt文件多为辅助说明或模块内容整体43.63MB体积轻量。资源已吸引609人学习下载。对需要离线查阅CMake语法、构建系统与预设机制或希望快速部署命令行构建工具的开发者而言这份绿色包既能提供完整命令手册也省去安装步骤实用性强。1. CMake 3.29.7 Windows 绿色包解压即用的 C 构建工具CMake 3.29.7 的 Windows x86-64 官方绿色包是 Windows 上装 CMake 最省事的方式不跑安装器、不写注册表、解压完把 bin 加进 PATH 就能直接用。对 C 开发来说这套包里不只是 cmake.exe还有配套的 ctest、cpack、cmake-gui以及一份完整的离线 HTML 文档doc 目录里 cmake.1.html、cmake-presets.7.html 这些手册都能直接翻。我第一次用这个包是在一台不允许随便装软件的编译机上解压加 PATH 两个动作五分钟配好环境后面整个工程的 CMakeLists 全部正常构建所以这个方案我到现在一直在用。适合谁Windows 上写 C、想快速搭构建环境的人需要在多版本 CMake 之间切换的部署场景以及被 Visual Studio 安装器体积劝退的轻量用户。下面从解压、PATH 配置到 preset 固化每一步都按我实际跑过的流程写参数和坑都会标出来。2. 解压与 PATH 配置bin 目录接进环境变量的三个细节2.1 为什么选官方 zip 而不是安装器cmake.org 的 download 页面同时提供 zip 和 msi 两种 Windows 包。msi 安装器会写注册表、自动配 PATH、带卸载入口适合桌面用户zip 是纯粹的绿色解压包bin 目录下 cmake.exe、ctest.exe、cpack.exe、cmake-gui.exe 和运行所需的 dll 全都在share 目录放各语言的模块定义doc 目录是 HTML 版官方文档里面有 cmake.1.html、ctest.1.html、cmake-presets.7.html、cmake-generator-expressions.7.html、cmake-file-api.7.html 这些手册离线排查问题不用联网搜。zip 版的核心优势是隔离性和可控性。第一不需要管理员权限解压到用户目录就能跑适合没有本机管理员账号的编译机或远程桌面环境。第二多版本可以并存互不干扰C:\tools\cmake-3.29.7-windows-x86-64 和 C:\tools\cmake-3.28.0 放一起切 PATH 顺序或直接调完整路径就能换版本而 msi 装多版本时卸载、覆盖的纠纷很麻烦。代价是 PATH 要自己配以及不会有自动更新。对工程环境来说这反而是优点CMake 版本是一个决定性变量升级应该是有意为之而不是被安装器悄悄带上去。所以我一直推荐生产机用 zip 版版本钉死构建结果才可复现。2.2 配置环境变量用户级还是系统级追加还是覆盖我习惯把 zip 解压到 C:\tools\cmake-3.29.7-windows-x86-64。注意解压路径和源码工程路径都别带中文和空格这一步在第 4 章 4.4 会看到原因。然后打开环境变量编辑器WinR 输入 sysdm.cpl 回车或者 Windows 11 里走「设置 → 系统 → 系统信息 → 高级系统设置」都能到同一个界面。在环境变量面板里选中 PATH点「新建」填入 C:\tools\cmake-3.29.7-windows-x86-64\bin注意是 bin 子目录不是外层目录这里最容易写错。改用户变量不需要管理员权限只对当前用户生效改系统变量需要管理员提权所有用户共享。个人开发机用用户变量足够CI 编译机和多人共享机器才需要动系统变量。更可控的方式是用命令行设置用户级 PATHPowerShell 里这样操作$cmakeBin C:\tools\cmake-3.29.7-windows-x86-64\bin # 取出用户级 PATH把 cmake 的 bin 拼到最前面再写回用户级 [Environment]::SetEnvironmentVariable( Path, $cmakeBin ; [Environment]::GetEnvironmentVariable(Path, User), User )SetEnvironmentVariable 的三个参数分别是变量名、新值、作用域第三参传 User 写用户变量传 Machine 写系统变量需要管理员权限。把新路径放在最前面是为了让 PATH 里可能存在的旧 CMake 靠后站——Windows 查找 exe 时按 PATH 顺序取第一个命中位置决定版本。如果只是当前终端临时试一下直接 $env:Path $cmakeBin ; $env:Path 就行关终端即失效不影响系统。改完 PATH 之后必须重开终端已经打开的窗口使用的还是旧环境变量快照这是后续所有「明明配了怎么还是不行」里最常见的一条。2.3 验证三连新终端、版本、路径配完 PATH新开 cmd 或 PowerShell 窗口第一步确认版本cmake --version # 期望输出 # cmake version 3.29.7 # CMake suite maintained and supported by Kitware (kitware.com/cmake).版本号对上了说明 cmake.exe 已被找到。第二步确认它来自哪个路径防止命中的是别的版本# cmd 用 wherePowerShell 用 Get-Command where cmake # 输出第一个 # C:\tools\cmake-3.29.7-windows-x86-64\bin\cmake.exewhere cmake 会把 PATH 里所有 cmake.exe 全列出来第一个是实际命中的。如果列出来的是别的目录说明 PATH 里有旧版本排在前面回到 2.2 把新 bin 挪到最前或者把旧条目删掉。这一步我每台新机器都会跑原因很简单多套 CMake 混装是 Windows 上最隐蔽的环境炸弹configure 和 build 本身不报错但生成的构建系统行为会和预期不一致。最后顺手验证打包进来的其余组件ctest --version cmake-gui # 弹出图形界面即正常ctest 是测试驱动工具第 3 章跑测试时要用cmake-gui 是可视化配置界面第 5 章会细讲。这两个验证完环境才算真正就绪。3. 最小 C 工程从 CMakeLists.txt 到可执行文件的完整链路3.1 最小 CMakeLists.txt每一行都讲清楚建一个 hello 目录放两个文件。main.cpp 是最简单的可执行程序#include iostream int main() { std::cout hello from cmake 3.29.7 std::endl; return 0; }CMakeLists.txt 是构建描述的核心。网上能抄到一堆模板但很多人抄完不知道每行干什么出问题不知道怎么改。我用的最小版本是这样# 声明最低 CMake 版本低于此版本直接报错 cmake_minimum_required(VERSION 3.10) # 工程名 hello语言只启用 CXX project(hello LANGUAGES CXX) # 生成可执行文件目标目标名 hello源文件 main.cpp add_executable(hello main.cpp) # 把 C 标准钉在 C17编译器不支持就报错而不是静默降级 set_property(TARGET hello PROPERTY CXX_STANDARD 17) set_property(TARGET hello PROPERTY CXX_STANDARD_REQUIRED ON)cmake_minimum_required 不只是门槛检查它还决定 CMake 的策略档位。版本写太低新 CMake 会按旧策略运行一些行为会不一样写太高旧 CMake 直接拒跑。3.10 对 hello 足够但实际工程我建议至少 3.16要用 presets 等新特性就得 3.25 以上。CXX_STANDARD 是 per-target 属性作用是给编译命令追加 -stdc17REQUIRED ON 表示编译器不支持 17 就报错不会偷偷降级到默认标准。3.2 configure、build、run 三步走在 hello 目录下开终端标准三步# 第 1 步configure读取 CMakeLists.txt在 build 目录生成构建系统 cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPEDebug # 第 2 步build执行编译链接-j 8 开 8 个并行任务 cmake --build build -j 8 # 第 3 步运行生成的 exe ./build/hello.exe-S 指定源码根目录-B 指定构建目录这两个写全之后CMake 会在 build 下生成 CMakeCache.txt 和构建系统文件。configure 阶段不编译任何代码只是把规则确定下来真正的编译发生在 cmake --build。-G 指定生成器Ninja 要求 ninja.exe 在 PATH 里没装 Ninja 的话MinGW 环境用 MinGW Makefiles装了 VS 2022 用 Visual Studio 17 2022。不写 -G 时 CMake 自己探测装了 VS 优先 VS没有 VS 就看 PATH 里有没有 mingw32-make结果不可控我建议每次写死。这里顺带回应一个高频问题「cmake 和 makefile 的区别」CMake 本身不编译它根据 CMakeLists.txt 生成 Makefile 或 build.ninja后面还是 make 或 ninja 在干活。-DCMAKE_BUILD_TYPEDebug 在 Ninja 这类单配置生成器下等于编译加 -g、不开优化方便 gdb 调试。3.3 build 目录里的黑匣子和两个高频参数configure 完成后build 目录里最值得关注的是 CMakeCache.txt所有 -D 参数、编译器探测结果、生成器信息全在里面。第二次 configure 时 CMake 优先读缓存所以改了 -D 参数后旧值有时会顽固残留这是很多玄学问题的源头。CMake 3.24 起有 --fresh 参数可以根治# 删除缓存完全重新配置换构建类型前先跑这个 cmake -S . -B build -DCMAKE_BUILD_TYPERelease --fresh # 查看实际执行的编译命令行排查 include 路径和宏定义 cmake --build build --verbose--fresh 会把 build 目录下的缓存清掉再从头配置。我只要怀疑缓存残留导致行为不对第一件事就是它。--verbose 会把 g 或 cl.exe 真正执行的完整命令行打出来包括所有 -I 包含路径和 -D 宏定义查头文件找不到、宏没生效这类问题比猜快得多。注意--fresh 只清缓存不会删除已经编译出的 .obj 和 .exe所以换编译器或换构建类型后有时需要连 build 目录一起删掉重来否则旧的中间文件可能干扰链接。工程连测试一起交的话zip 包里那个 ctest.exe 就该登场了。CMakeLists.txt 尾部加两行enable_testing() add_test(NAME hello_runs COMMAND hello)然后ctest --test-dir build --output-on-failurectest --test-dir 从 3.20 起支持直接指定 build 目录不用先 cd 进去。--output-on-failure 是排查关键测试失败时把进程的 stdout 和 stderr 完整打出来不然 ctest 只会给你一句 fail 记录等于没查。4. 避坑清单Windows 上 CMake 安装使用最常见的五个坑这一章是纯血泪经验下面五条每一条我都见过至少一次真实事故按现象 → 原因 → 解决三段写你对照着排查就行。这里有个通用前提所有排查开始之前先确认 where cmake 和 cmake --version 的输出版本没对上先回第 2 章别在错误的版本上浪费时间。4.1 终端不认 cmake 命令现象刚配完 PATH新开终端跑 cmake --version提示「cmake 不是内部或外部命令」。原因两个来源最常见。一是旧终端窗口的环境变量快照固化在窗口创建时不会自动刷新二是改的是用户 PATH但终端用管理员权限打开管理员进程读取 PATH 的时机与普通窗口不同用户变量改动常被漏掉。解决关掉所有旧窗口重开一个。还不行就在终端里 echo %PATH% 确认当前值重点检查路径是否写到了整个 cmake-3.29.7-windows-x86-64 目录而漏了最后的 \bin。4.2 版本不对PATH 里有多个 CMake现象明明解压了 3.29.7cmake --version 显示 3.28 或更老。原因PATH 里存在多个 cmake.exe旧的排前面Windows 按顺序查找命中了旧版。Qt、Python 工具链、部分 IDE 都会顺手往 PATH 塞自己的 CMake。解决where cmake 列出全部路径凡是带版本号又不是你主动装的先看它属于哪个软件。新版 bin 挪到最前面仍被覆盖时检查是不是系统变量 PATH 里的旧条目在作怪——Windows 合并 PATH 的顺序固定是系统变量在前、用户变量在后用户变量改得再靠前也压不过系统变量这种情况要把系统 PATH 里的旧 CMake 条目删掉。4.3 configure 找不到编译器现象cmake -S . -B build 报 CMake was unable to find a build program corresponding to MinGW Makefiles或 No CMAKE_CXX_COMPILER could be found。原因生成器和编译器是两回事。-G 指定的是生成构建系统的工具Ninja 要 ninja.exe、MinGW Makefiles 要 mingw32-make.exe实际编译 C 的是编译器 g 或 cl.exe。生成器对应的工具链不完整configure 探测编译器直接失败。解决每次 configure 把生成器和编译器一次写全-G Ninja -DCMAKE_CXX_COMPILERg 这样 CMake 不用猜报错也直指问题。装了 VS 就用 -G Visual Studio 17 2022MinGW 环境就用 -G MinGW Makefiles。预防动作装 MinGW 后先确认 g --version 和 mingw32-make --version 都通再跑 CMake。4.4 路径带中文或空格构建中途翻车现象configure 正常build 阶段报奇怪错误比如 ninja: error: C:/项目/编译测试/main.cpp或 MSVC 报 fatal error C1034 找不到头文件。原因CMake 对 Unicode 路径支持尚可但下游的 ninja、make、编译器对非 ASCII 路径支持参差空格路径在 Makefile 里容易触发转义问题。解决源码目录和 build 目录全部放英文路径C:\work\hello 这种最省心。解压 CMake 的路径同理我在 2.2 强调过因为 CMake 部分模块会从安装路径推导自身位置安装路径带中文后续的错误很难排查。git clone 下来的仓库也别放桌面或下载目录那些路径在部分 Windows 账户下可能带中文用户名。4.5 VS 生成器找不到 cl.exe现象-G Visual Studio 17 2022 configure 报错提示找不到 MSVC 或 cl.exe。原因cl.exe 依赖 vcvars64.bat 注入的 INCLUDE、LIB、PATH 等环境变量普通 cmd 里没有。另外只装 VS 的 Build Tools 但没勾「使用 C 的桌面开发」工作负载时工具链不完整CMake 探测也会失败。解决打开 Visual Studio Installer 确认已勾选「适用于 v143 生成工具的 MSVC」和「Windows SDK」。命令行场景用「x64 Native Tools Command Prompt for VS 2022」快捷方式进终端再跑 cmake这是最稳的入口我自己在 Windows 上做 MSVC 构建永远从这里进或者在普通终端先执行 C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat 再调 cmake效果相同。把这五条串起来看本质就一句话Windows 上出问题先怀疑环境再怀疑 CMakeLists。版本、PATH、编译器、路径字符四个维度过一遍大部分报错都能定位。5. 生成器与编译器组合cmake-gui 里那些参数到底改什么5.1 生成器选型Ninja、MinGW Makefiles、VS 怎么选生成器决定构建系统长什么样也决定你后续能用哪些参数。最常见的三张组合生成器构建系统产物适用场景前置条件Visual Studio 17 2022.sln .vcxproj用 MSVC、要和 VS IDE 联动、要碰 Windows SDKVS 2022 已装且含 C 负载Ninjabuild.ninja构建速度最快、增量编译舒服、CI 常用ninja.exe 在 PATH配 g/clang/cl 都行MinGW MakefilesMakefile轻量、有 MinGW-w64 但不想装别的东西mingw32-make.exe 和 g 在 PATH选型逻辑很简单团队统一用 VS 就选 VS 生成器产物和 IDE 集成最自然追求速度用 NinjaMinGW Makefiles 适合临时环境能跑但增量构建比 Ninja 慢。Ninja 本身不是编译器它只是构建调度器真正编译的还是 g 或 cl.exe这一点经常被新手混在一起导致 configure 报错时不知道该补装哪个。5.2 用 -D 参数钉死编译器和运行库configure 阶段最常改的变量是编译器路径和构建类型。编译器不在 PATH 里就写绝对路径# 显式指定 MinGW 的 g避免 PATH 里混着多个编译器时选错 cmake -S . -B build -G Ninja \ -DCMAKE_CXX_COMPILERC:/mingw64/bin/g.exe \ -DCMAKE_BUILD_TYPERelease注意路径分隔符用正斜杠反斜杠在 CMake 参数里要转义容易踩。CMAKE_BUILD_TYPE 是单配置生成器Ninja、MinGW Makefiles专用的变量它只在 configure 时生效之后改没用必须重新 configure。多配置生成器VS、Ninja Multi-Config则相反configure 时不用管构建类型构建阶段用 --config 指定# VS 生成器下Debug 和 Release 是构建时的选择 cmake --build build --config Release这个区别是 90% 以上「我改了 Release 怎么还是 Debug 行为」的根源——你在 VS 工程上 -DCMAKE_BUILD_TYPERelease 是徒劳的它根本不读这个变量。VS Code 里 CMake Tools 底部状态栏那个 Configure 按钮背后其实就是帮你执行一遍 configure如果你在 json 里配了构建类型它会体现出来。MSVC 下还有一个容易踩的参数是运行库。假设你要部署到没装 VC 运行库的机器上就得把默认的 /MD 改成 /MT 静态链接cmake -S . -B build -G Visual Studio 17 2022 \ -DCMAKE_MSVC_RUNTIME_LIBRARYMultiThreadedCMAKE_MSVC_RUNTIME_LIBRARY 有四个值MultiThreaded 对应 /MTMultiThreadedDLL 对应 /MD默认还有带 Debug 的两个变体 MultiThreadedDebug 和 MultiThreadedDebugDLL。这个变量 3.15 起可用3.29.7 完整支持。如果你在混用预编译第三方库库是 /MD 编的、你这边 /MT链接期必然翻车所以这个参数通常要和依赖库的构建约定对齐后再定。Qt 用户常报的「Qt5Config.cmake 找不到」也属于同类问题本质是 CMAKE_PREFIX_PATH 没指到 Qt 安装目录cmake-gui 的缓存表里能看到这个变量。5.3 cmake-gui可视化的 configure 和 Cache 黑匣子zip 包里自带 cmake-gui.exe双击就能开不依赖命令行。界面左边选源码目录和 build 目录点 Configure 会先弹生成器选择框选完跑一轮探测然后把所有 cache 变量列在中间的大表格里。你改完变量想生效要点 Generate 才会真正写构建系统——很多人改完直接关窗口下次打开发现改动没保存就是漏了 Generate。GUI 的价值在调试当你怀疑某个变量值不对时缓存表里能看到 CMake 探测到的真实值比如 CMAKE_CXX_COMPILER 到底指向了哪个 g、CMAKE_GENERATOR 是什么比命令行黑盒直观得多。但 GUI 的坑也很典型改完变量后没重新 Configure 直接 Generate或者 Configure 时选的生成器和命令行里不一致导致两个 build 目录互相踩。我一般把 GUI 当成只读检查工具真正改参数还是命令行加缓存文件。另外一个容易忽略的点VS Code 的 CMake Tools 插件默认通过 CMake File API 读 build 目录里的 .cmake/api 文件来拿 target 信息zip 包 doc 目录里的 cmake-file-api.7.html 讲的就是这个机制。所以只要 CMake 版本和构建目录正常VS Code 底部状态栏会出现 Configure 按钮点击之后目标列表、调试配置都会自动同步。如果没看到按钮八成是插件探测不到 cmake 可执行文件回到第 2 章检查 PATH别去折腾插件。6. 进阶用 CMakePresets.json 把参数固化换机器不翻车工程大了之后每次敲一长串 -D 参数既不统一也容易漏。CMake 3.19 引入 presets 机制3.29.7 完整支持 version 6 规范zip 包里 doc 目录的 cmake-presets.7.html 就是官方说明。我在工程根目录放一个 CMakePresets.json把生成器、编译器、构建类型全部写死{ version: 6, cmakeMinimumRequired: { major: 3, minor: 25, patch: 0 }, configurePresets: [ { name: ninja-debug, generator: Ninja, binaryDir: ${sourceDir}/build/ninja-debug, cacheVariables: { CMAKE_BUILD_TYPE: Debug, CMAKE_CXX_COMPILER: g } } ], buildPresets: [ { name: ninja-debug, configurePreset: ninja-debug } ] }之后的操作收敛成两条固定命令cmake --preset ninja-debug cmake --build --preset ninja-debugcmake --preset 一次完成 configure--build --preset 连 -B 都不用写preset 里没写的分支全部用默认。${sourceDir} 是自动展开的源码根目录binaryDir 写相对路径工程挪到哪都成立。团队里只要统一 preset就不会有人多传一个参数导致构建产物不一致。如果构建系统里有自定义命令还会用到 generator expression比如 $TARGET_FILE:hello 取目标产物路径这类写法的细节 zip 包里的 cmake-generator-expressions.7.html 写得很全离线就能查。从那以后我每拿到一台新 Windows 机器第一件事永远是解压、配 PATH、cmake --version 和 where cmake 全走一遍再决定用哪个 preset。这套流程不到十分钟省掉的是整个下午的玄学调试。希望帮到你。本文还有配套的精品资源点击获取