简介:CMake 3.28.6 Windows x86_64 安装包,为 Windows 平台开发者提供跨平台构建工具的最新稳定版,适用于需要编写与管理 CMakeLists.txt 的 C/C++ 项目开发者,可解决从配置、编译到安装的自动化构建需求。压缩包共 2000 个文件,以 1171 个 txt 与 829 个 html 为主,txt 多用于存放命令帮助与说明文本,html 为官方文档页面,涵盖 CMake 命令参考、生成器表达式、构建系统、预设、变量、文件 API、CTest 测试工具等主题,便于本地离线查阅。包体大小约 43.06MB,目录组织清晰,适合在无网络环境下快速检索。已有 397 人学习下载,对希望深入理解 CMake 构建机制、排查构建脚本问题的开发者而言,这是一份可直接使用的官方英文文档合集,也能帮助初学者对照学习各指令与变量的实际写法。
1. cmake-3.28.6-windows-x86_64.zip:为什么老手偏要 ZIP 版而不是 EXE 安装版
每个从官网下载 CMake 的人都会面对同一个选择:下 zip 还是下 exe 安装版。多数人随手装了 exe,真正做 Windows 上 C++ 跨平台构建的老手,却经常把 cmake-3.28.6-windows-x86_64.zip 这类压缩包单独存一份。这个文件本身不大,但“解压即用、不写注册表、多版本并存互不污染”这三个特性,直接决定了你在 CI 脚本和本机环境里能不能省心。这篇东西就是照着“拿到这个 zip 之后怎么办”写的一条龙路径,覆盖安装、配 PATH、选生成器、配合 VSCode 和 CMake GUI 用,以及我最想让你避免的几个翻车现场。
2. 装对第 0 步:zip 版解压、PATH 配置与版本验证
2.1 ZIP 与 EXE 安装版的实际差别,不只是少下一步
官方对 Windows 提供两种二进制交付:一个是以.exe结尾的安装引导程序(NSIS 打的包),另一个就是标题里这种.zip免安装压缩包。两者内部装的同一套 CMake,bins 目录下的cmake.exe、ctest.exe、cpack.exe完全一致,差别全在外面的壳上。
exe 版会往C:\Program Files\CMake写文件,写注册表来登记卸载信息,还会弹一个“把 CMake 加入 PATH”的选项。这些动作看着省事,实际给后续埋雷:版本升级要重新跑安装器,旧版本残留的注册表项偶尔会让 Visual Studio 的 CMake 集成探测到错误的 CMake 路径。zip 版完全不碰注册表,解压到你指定的目录就算安装结束,卸载就是把目录删掉。
多版本并存时这个优势会被放大到极致。我至少见过三个真实场景需要旧版 CMake:给老项目临时编译的时候CMakeLists.txt里写了cmake_minimum_required(VERSION 3.10),但新版本 3.28 对某些废弃写法直接报错;CI 脚本锁死3.28.6这个具体版本号,本地必须和它保持一致;某些第三方 SDK 的 CMake 配置文件只在新版本上测过,你被夹在中间只能来回切。zip 版的路径互不干扰,切版本就是把 PATH 的开头换一条,不需要卸载安装。
另外注意文件名里的x86_64指的是 CMake 程序本身的架构,不是说你只能用它编译 64 位程序。在 64 位 Windows 上装 x86 版也能编译 x64 target,但 3.28 之后官方对 x86 文件的维护肯定不如 x86_64 上心,能用 x86_64 就别委屈自己。
2.2 解压位置与目录命名:两个容易后悔的小决定
目录命名这件事看着不起眼,踩过坑的人都知道痛。很多教程让你解压到C:\CMake然后配环境变量,这没问题。但我建议解压后保留版本号在目录名里,类似C:\tools\cmake-3.28.6-windows-x86_64,不要手贱把它改成C:\tools\cmake。
原因有两个。第一,后续你是要从 PATH 里引用这个目录的,一旦目录名里少了版本号,升级 3.30 或者 3.32 的时候要么改 PATH 要么覆盖旧文件,怎么选都是麻烦。第二,CMake 的模块文件和编译器探测逻辑不依赖安装路径里的字母,但 Visual Studio 集成和 CMake Tools 扩展会在缓存里记录绝对路径,路径一变动,VSCode 那边就会显示一连串的“编译器路径失效”,你得重新 Configure 一次。目录名带版本号,至少你能在焦虑的时候立刻看出来自己引用的是哪一份。
解压本身没什么玄学,右键“解压到当前文件夹”或者用命令行都行。我习惯用 PowerShell 的Expand-Archive,因为偶尔遇到损坏的压缩包,这个命令会直接报错而不是解出一半文件让你怀疑人生。
Expand-Archive -Path "$env:USERPROFILE\Downloads\cmake-3.28.6-windows-x86_64.zip" ` -DestinationPath "C:\tools"逻辑说明:把下载目录里的 zip 解压到C:\tools下,解压后自动生成cmake-3.28.6-windows-x86_64文件夹。参数-Path指定 zip 来源,-DestinationPath指定解压目标。如果你已经用 Windows 资源管理器解压过,这步可以跳过,目录结构是一样的。
2.3 手动配 PATH:两种 shell,各给一套写法
解压完之后,cmake.exe实际位于C:\tools\cmake-3.28.6-windows-x86_64\bin。你需要把这个bin目录加进系统环境变量Path,CMake 才能在任何终端里被直接调用。这里给两种 shell 的写法,按你常用的挑一种。
先看 PowerShell,当前用户级别,不开管理员权限也能生效:
$cmakeBin = "C:\tools\cmake-3.28.6-windows-x86_64\bin" $oldPath = [Environment]::GetEnvironmentVariable("Path", "User") $newPath = if ($oldPath -match [regex]::Escape($cmakeBin)) { $oldPath } else { $oldPath + ";$cmakeBin" } [Environment]::SetEnvironmentVariable("Path", $newPath, "User")逻辑说明:先拼出 bin 目录的绝对路径,读取当前用户的 Path 环境变量,如果里面已经有这条路径就保持不变,否则在末尾追加。最后写入的时候第三个参数填User,表示只改当前用户的 PATH,不需要管理员权限。这样写比setx强的地方在于:setx有 1024 字符截断的老毛病,系统里 PATH 长一点就会把后面的条目悄悄丢掉,每次看到这种截断事故我都头大。
再看 cmd 里的写法,同样只改用户变量:
:: 追加 cmake 的 bin 目录到用户 PATH setx PATH "%PATH%;C:\tools\cmake-3.28.6-windows-x86_64\bin"注意这里有个经典的坑:setx会把当前终端里的%PATH%展开后全部写回,但系统 PATH 和用户 PATH 是合并展示的,所以你等于把系统变量里的内容也复制了一份到用户变量里。后面对where cmake的执行顺序会产生影响,排查多版本问题时会多花几分钟。能用 PowerShell 那版就别用这个。
2.4 验证安装:版本号、解析路径、目录三连检查
配置完 PATH,新开一个终端做验证,不要用配置前的旧终端。三个命令按顺序敲:
cmake --version看到cmake version 3.28.6就说明核心安装没问题。接着用它确认你调用的到底是不是刚解压的这一份:
where cmake这条在 Windows 上会列出所有能被找到的cmake.exe路径,排最上面的就是实际生效的。如果第一行不是你刚配的C:\tools\cmake-3.28.6-windows-x86_64\bin\cmake.exe,说明 PATH 里还有别的 CMake 排在前面,需要去检查是否有旧版本残留。最后可以顺手看一眼目录大小,CMake 3.28 的完整发布包大约有几十兆,如果解压出来只有几兆,多半是你的压缩软件只解了外层,没解出全部文件。
到这里,cmake-3.28.6-windows-x86_64.zip 作为环境工具就算安装完成了。下一步才是真正决定“能不能编译出东西”的环节——选生成器。
3. 三个高频工作流:命令行、MinGW-w64 与 VSCode/CMake GUI 的配置玄机
3.1 一个最小项目:用命令行跑通 Configure 与 Build
先看一个能完整跑通的极简示例,后面所有工作流都依赖这一套底层逻辑。目录结构如下:
D:\demo\ CMakeLists.txt main.cppCMakeLists.txt只写必要内容:
cmake_minimum_required(VERSION 3.16) project(DemoProject LANGUAGES CXX) add_executable(demo main.cpp)main.cpp随便写一个能打印字符串的程序即可。然后在D:\demo下新建一个build目录并进入,执行:
mkdir build cd build cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release cmake --build .逻辑说明:cmake ..表示 CMakeLists.txt 在上一级目录,-G指定生成器。这里用的NMake Makefiles对应 Visual Studio 自带的 NMake 工具,适合只需要命令行构建、不需要工程文件的快速场景。-DCMAKE_BUILD_TYPE=Release声明编译优化模式。cmake --build .是跨生成器的统一构建命令,CMake 会自动把参数翻译成 NMake 的nmake调用。
这一套跑完,build目录里会出现demo.exe。注意一个细节:如果-G不指定,CMake 会在 Windows 上用内置顺序挑选默认生成器,先看 Visual Studio 系列,再看 MinGW,顺序不可控。显式指定是所有脚本和教程的共识,后面两节展开说。
3.2 搭配 MinGW-w64:解决“找不到编译器”和“sh.exe in PATH”
没有装 Visual Studio、或者打算完全脱离 MSVC 的人,通常会把手头这套 zip 版 CMake 和 MinGW-w64 配成一对。这时候-G参数要换成MinGW Makefiles:
cmake .. -G "MinGW Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_MAKE_PROGRAM=mingw32-make逻辑说明:MinGW Makefiles生成的是给mingw32-make用的 Makefile。CMAKE_C_COMPILER和CMAKE_CXX_COMPILER直接指到 gcc/g++,防止 CMake 在系统里乱猜。CMAKE_MAKE_PROGRAM显式告诉 CMake 用哪个 make 程序——这条非常重要,因为 CMake 在找 make 时会优先试探make.exe,但 MinGW-w64 的发行版里可执行文件通常叫mingw32-make.exe,俩名字对不上就会直接报错“No CMAKE_MAKE_PROGRAM found”。
还有一条 MinGW 特有的血泪经验:如果 Git 被你装过,它的usr\bin目录里带了一个sh.exe,CMake 的编译器探测模块偶尔会被这个sh.exe干扰,导致整个配置流程在编译器测试阶段失败。报错信息里会带着sh.exe字样,很多人第一次看根本想不通这和编译器有什么关系。解决办法就是在环境变量里临时去掉 Git 的/bin或/usr/bin目录,Configure 完再加回来,或者从一开始就在 Configure 这一步用-G "Visual Studio 17 2022" -A x64系列生成器绕开。
3.3 VSCode + CMake Tools:状态栏的 Configure 按钮为什么出不来
热词搜索里有一个出现频率特别高的问题:VSCode 装完 CMake Tools 扩展之后,底部状态栏根本没有 Configure 按钮。排查思路按顺序走,大概率在第二步就能解决。
先看settings.json里的关键配置:
{ "cmake.cmakePath": "C:\\tools\\cmake-3.28.6-windows-x86_64\\bin\\cmake.exe", "cmake.generator": "MinGW Makefiles", "cmake.configureArgs": [ "-DCMAKE_MAKE_PROGRAM=C:\\Program Files\\mingw64\\bin\\mingw32-make.exe" ] }逻辑说明:cmake.cmakePath强制扩展使用你解压出来的这份 CMake,而不是去 PATH 里乱找。cmake.generator跳过默认生成器探测,直接走 MinGW 路线。cmake.configureArgs会把数组里的每个字符串当作额外参数传给 Configure 过程,这是补CMAKE_MAKE_PROGRAM最稳妥的方式——你写进全局环境变量和系统里的 PATH,都不如在这里显式点名可靠。
接下来是状态栏按钮不出现的三个原因,按概率从高到低排。
第一,你打开的文件夹不是项目根目录。CMake Tools 只有在当前工作区根目录下存在CMakeLists.txt时才会激活项目模型,如果你把 VSCode 打开到了D:而不是D:\demo,扩展会一直处于休眠状态。解决:用文件 → 打开文件夹选中包含 CMakeLists.txt 的那一层。
第二,cmake.cmakePath指向的 CMake 版本太老或路径写错。只要 CMake Tools 激活失败,状态栏就只会显示一组编译/调试按钮,不显示 Configure。解决:验证一下cmake.exe --version在终端里能不能跑,不能跑就检查 JSON 里的双反斜杠转义。
第三,扩展已经加载但项目缓存坏了。VSCode 内选择命令面板,跑一次“CMake: Delete Cache and Reconfigure”,相当于清掉build目录里的CMakeCache.txt重新探测一次。绝大多数“升级 CMake 版本后状态栏死掉”的情况,这一步直接治好了。
3.4 CMake GUI:编译 OpenCV 这类第三方库时的正确打开方式
命令行能解决 80% 的日常构建,但当你需要编译 OpenCV、编译带一堆开关的算法库时,CMake GUI(cmake-gui.exe)依然是效率最高的黑匣子透视工具。它的价值不在于省事,而在于它把你每一次点选开关时实际注入的命令行参数全部公开在底部输出窗口里,排错的时候不用盲猜。
GUI 的基本操作流程是固定的:Where is the source code填源码目录,Where to build the binaries填一个全新的 build 目录,然后点 Configure。第一次 Configure 时它会弹生成器选择框,这里必须和你要用的编译器对齐——之前用 MinGW 环境做的选择,这里就选MinGW Makefiles,同时把CMAKE_MAKE_PROGRAM指向mingw32-make.exe;之后点 Generate,CMake 就会在 build 目录里生成对应格式的工程文件或 Makefile。
对于 OpenCV 这种大型项目,有六个开关值得你多看一眼,它们直接决定你编译一个晚上还是一个上午。WITH_CUDA不开就尽量用 CPU 版本,避免驱动库的链接环节出问题;BUILD_opencv_world打开的话,所有模块会合并成一个opencv_world4xx.dll,部署时少带一打文件;BUILD_TEST和BUILD_PERF_TESTS建议关掉,示例代码如果不是为了学习也建议关;CMAKE_INSTALL_PREFIX提前改成你预期安装的目标盘路径,别等到最后装的时候才发现默认值落在 C 盘深处还要挪权限。
GUI 里最常见的操作失误是:你已经跑过一次 Configure,改完开关后忘记点 Generate,以为改了选项就等于配置过了。实际上选项修改只会在下一次 Configure 时生效,之后必须再点 Generate,二进制文件才会重新生成。这个顺序搞反了,编译时你会发现开关改了但没用,玄学感极强。
4. Windows 上踩过的 5 个坑:从 PATH 失效到生成器选错
4.1 解压完还是提示“cmake 不是内部或外部命令”
现象:zip 解压了,PATH 也配了,新开终端一敲cmake --version,提示“不是内部或外部命令”。
原因:最常见的有两种。一是终端没重开——Windows 环境变量变化不会实时通知已打开的窗口,你用配置前的老端口干活,读到的还是旧 PATH。二是 PATH 追加时把bin目录拼错了,末尾带了一个反斜杠或者把bin写成了bin的上级目录。
解决:先新开一个干净的终端,不要用刚才配置过的窗口测。如果还不行,用where cmake看当前环境实际解析到了哪条路径,没有输出就是 PATH 里根本没写进去。检查时注意C:\tools\cmake-3.28.6-windows-x86_64\bin这个路径复制到“系统属性 → 环境变量”编辑框的时候,不要把引号一起粘进去。
4.2 生成器选错导致的连锁报错
现象:Configure 阶段报CMAKE_C_COMPILER not found或Unable to find a matching Visual Studio,明明 GCC 和 Visual Studio 你都装了。
原因:CMake 在 Windows 上默认按优先级探测生成器,Visual Studio 优先于 MinGW。当你用-G指定了 MinGW Makefiles,CMake 就只找 MinGW 工具链,找不到就报错;反过来你指定了 Visual Studio 生成器,它也完全不会去碰 GCC。生成器选错不会出现“警告”,直接断在 Configure 阶段。
解决:确认手头要用的编译器,然后显式写生成器。用 VS 就写-G "Visual Studio 17 2022" -A x64,用 MinGW 就写-G "MinGW Makefiles" -DCMAKE_MAKE_PROGRAM=mingw32-make. 最怕的是自动模式,CMake 会把国内环境里各种残留工具链分个优先级,最后选出来的那一刻它并不会告诉你为什么。
4.3 路径带空格或中文,编译器直接罢工
现象:Configure 能过,一到编译阶段就报No such file or directory或者fatal error C1083,文件明明存在。
原因:CMake 自己对空格路径的处理做得好一些,能生成带引号的构建命令;但底层的 MSVC 或者 MinGW 的 make 工具对空格和中文路径支持不一致,编译器的预处理器在解析#include路径时,遇到空格会截断。中文路径的兼容性更差,GBK 和 UTF-8 编码交错会把 Windows SDK 的头文件解析成乱码。
解决:一句话,把整个项目移到纯英文、无空格的路径下。国内社区里每年都有大量这类帖子,根源就是这么简单。如果你实在不能改目录名,就给编译器补-DCMAKE_USE_RELATIVE_PATHS=ON,但这条不是所有版本都稳定支持,别太指望它。
4.4 脚本调用的 CMake 和你以为的不是同一份
现象:在终端里cmake --version是 3.28.6,但跑 OpenCV 的编译脚本时,脚本输出的版本是 3.22 或者更老。这种现象在 Python 调用 CMake 时特别常见,比如pip install opencv-python在源码编译时会去找cmake,找的却是系统里 Python 包自带的另一个 cmake。
原因:PATH 里存在多条 cmake 路径,终端解析到 A,脚本运行环境解析到 B。常见的干扰源包括:Python 虚拟环境里的自定义 cmake、numpy 或 OpenCV 构建时临时安装的 cmake、VSCode CMake Tools 自动下载的 cmake。where 命令只会展示当前 shell 的解析结果,脚本进程里的 PATH 还得单独看。
解决:脚本里显式指定 cmake。对 Python 类场景,可以在脚本开头os.environ["PATH"] = "C:\\tools\\cmake-3.28.6-windows-x86_64\\bin;" + os.environ["PATH"];对命令行场景,直接把完整路径写进去,比如C:\tools\cmake-3.28.6-windows-x86_64\bin\cmake.exe ..。别省这个字,省下来的时间都会变成排错时间。
4.5 Qt5Config.cmake not found:90% 不是版本问题,是配置没指到位
现象:编译 Qt 项目时 Configure 阶段报By not providing "FindQt5.cmake" in CMAKE_MODULE_PATH或直接Qt5Config.cmake not found,后面跟着一个长长的搜索路径列表。
原因:前三个字面原因占了大多数——CMAKE_PREFIX_PATH没设置、路径指向的 Qt 目录不包含lib/cmake/Qt5子目录、Qt 的预编译二进制和当前编译器 ABI 不匹配(MSVC 编译的 Qt 被 MinGW 工具链拿去用,或者反过来)。最后一个原因特别隐蔽,因为报错文本都是同一段,不看前面的工具链信息根本无法区分。
解决:先确认 ABI 匹配,MinGW 编的 Qt 库就配 MinGW 工具链,MSVC 配 MSVC。然后在 Configure 阶段显式传入前缀路径:
cmake .. -DCMAKE_PREFIX_PATH="D:\Qt\5.15.2\msvc2019_64"逻辑说明:CMAKE_PREFIX_PATH是 CMake 查找依赖库的总前缀,Qt 的 CMake 配置包位于该路径下的lib\cmake\Qt5,只要前缀指对了,find_package(Qt5)会自动找到配置。如果这个参数不生效,多半是因为你把路径写到了Qt5_DIR上但给的路径不对——Qt5_DIR要精确到包含Qt5Config.cmake的那个目录,也就是D:\Qt\5.15.2\msvc2019_64\lib\cmake\Qt5,写错一级就找不到。
5. 让 zip 版 CMake 更好用的进阶验证技巧
如果你已经把前面几章跑通了,最后一件事值得做:给项目加一份CMakePresets.json,把“配置参数靠记忆、每次敲命令行都怕少一个 -D”的这个日常痛点直接消掉。这份文件放在项目根目录下,CMake 3.28 原生支持,不需要装任何额外插件。
{ "version": 3, "configurePresets": [ { "name": "mingw-debug", "generator": "MinGW Makefiles", "binaryDir": "${sourceDir}/build/mingw-debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", "CMAKE_MAKE_PROGRAM": "C:/Program Files/mingw64/bin/mingw32-make.exe" } } ], "buildPresets": [ { "name": "mingw-debug", "configurePreset": "mingw-debug" } ] }逻辑说明:configurePresets把 Configure 阶段的所有参数固化下来,binaryDir指定构建目录,这样不同编译器的构建产物自动分开,不会互相污染;buildPresets配置好之后,构建阶段只需要写cmake --build --preset mingw-debug,不再需要记那一长串-D参数。对需要频繁切 VS 和 MinGW 两个工具链的人,这份文件的收益比任何教程都直接。
还有一个我自己的验证习惯:每次经过长时间编译后出现诡异运行时报错,我第一反应不是改源码,而是把 build 目录整个删掉重新 Configure 一次。CMake 的缓存机制决定了CMakeCache.txt里存了大量当时环境下的绝对路径和编译器检测结果,只要编译器、CMake 版本或者系统库发生过变化,缓存里的旧结论就可能悄悄失效。删除 build 目录从零开始,相当于给构建系统一次干净的后悔药,成本只有重编那几分钟。
开发环境这种事,看着琐碎,但绝大多数 Windows 上编译失败的时间都耗在“环境不一致”而非“代码写错”上。我现在拿到任何陌生项目,第一件事就是cmake --version加where cmake双重确认环境,然后直接删掉旧 build 目录重新配置,省过太多不明不白的报错。希望这一步一步的落地过程,能帮你把这个 zip 的价值真正用满。
本文还有配套的精品资源,点击获取