
简介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免安装压缩包。两者内部装的同一套 CMakebins 目录下的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目录加进系统环境变量PathCMake 才能在任何终端里被直接调用。这里给两种 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_TYPERelease cmake --build .逻辑说明cmake ..表示 CMakeLists.txt 在上一级目录-G指定生成器。这里用的NMake Makefiles对应 Visual Studio 自带的 NMake 工具适合只需要命令行构建、不需要工程文件的快速场景。-DCMAKE_BUILD_TYPERelease声明编译优化模式。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 Makefilescmake .. -G MinGW Makefiles -DCMAKE_C_COMPILERgcc -DCMAKE_CXX_COMPILERg -DCMAKE_MAKE_PROGRAMmingw32-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.exeCMake 的编译器探测模块偶尔会被这个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_PROGRAMC:\\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 GUIcmake-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之后点 GenerateCMake 就会在 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 MakefilesCMake 就只找 MinGW 工具链找不到就报错反过来你指定了 Visual Studio 生成器它也完全不会去碰 GCC。生成器选错不会出现“警告”直接断在 Configure 阶段。解决确认手头要用的编译器然后显式写生成器。用 VS 就写-G Visual Studio 17 2022 -A x64用 MinGW 就写-G MinGW Makefiles -DCMAKE_MAKE_PROGRAMmingw32-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_PATHSON但这条不是所有版本都稳定支持别太指望它。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 found90% 不是版本问题是配置没指到位现象编译 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_PATHD:\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 的价值真正用满。本文还有配套的精品资源点击获取