简介:本资源为CMake 3.28.6官方Windows x64版本完整安装包,面向C++开发者、跨平台项目构建工程师及CI/CD流程搭建人员,用于替代旧版或离线部署最新稳定版构建工具。压缩包内含2000个文件,以1171个文本文档(含配置说明、环境变量设置指引、常见错误解析)和829个HTML手册页(覆盖cmake命令行、生成器表达式、CTest测试框架、预设文件(presets)、文件API、构建系统规范等核心模块)为主,结构完整、文档齐备,可直接解压即用,无需额外安装。资源大小43.06MB,轻量高效,适配主流Windows开发环境。目前已有400人学习下载,读者可获得开箱即用的权威构建工具、全量离线帮助文档、标准化目录组织(含索引页与模块化手册),便于快速查阅语法细节、调试构建逻辑、验证生成器行为,是本地开发、教学演示及自动化构建脚本开发的重要支撑材料。
1. CMake 3.28.6 Windows x86_64 官方二进制包:不是“装个GUI就完事”的玩具,而是你构建 C++ 项目时绕不开的底层调度中枢
你写完CMakeLists.txt,双击cmake-gui.exe,点几下 Configure/Generate,以为工程就建好了——结果ninja: error: loading build.ninja: No such file or directory;或者用 Visual Studio 打开生成的.sln,编译报错LNK1104: cannot open file 'libboost_system-vc143-mt-x64-1_83.lib',但你根本没在find_package(Boost)里指定版本,更没搞懂CMAKE_MSVC_RUNTIME_LIBRARY是怎么把/MDd和/MT混在一起炸掉链接器的。这不是你代码的问题,是你手里的 CMake 不够“干净”、不够“可控”。cmake-3.28.6-windows-x86_64.zip就是那个能让你甩开 VS Installer 自带陈旧版本(3.21.x)、绕过 Chocolatey 包管理器玄学依赖、直接落地到C:\Program Files\CMake\bin的官方原生二进制包。它不含 GUI(cmake-gui.exe是附带的,但默认不注册系统 PATH),不捆绑任何编译器,也不自动改 registry——它只做一件事:把你的CMakeLists.txt精准翻译成 Ninja/MSBuild/MinGW Makefile 的中间指令。适合三类人:需要稳定复现 CI 构建环境的嵌入式工程师、被 Qt Creator 内置 CMake 版本卡死在 3.22 的跨平台开发者、以及正在为add_compile_definitions()和target_compile_definitions()切换而翻车的 C++20 项目维护者。
2. 解压即用:为什么必须手动配置 PATH,而不是双击安装?
2.1 文件结构解剖:bin/是唯一可信路径,doc/是调试黑匣子的后悔药
解压cmake-3.28.6-windows-x86_64.zip后,你会看到如下核心目录结构:
cmake-3.28.6-windows-x86_64/ ├── bin/ │ ├── cmake.exe ← 主程序,命令行入口 │ ├── cpack.exe ← 打包工具(生成 NSIS/ZIP/7z 安装包) │ ├── ctest.exe ← 单元测试驱动器(配合 `add_test()` 使用) │ └── cmake-gui.exe ← 图形界面(依赖 Qt5,但不自带 Qt DLL) ├── doc/ │ ├── cmake.1.html ← `man cmake` 的 HTML 版(Windows 下 `cmake --help` 无法显示完整手册) │ ├── cmake-buildsystem.7.html ← 构建系统语义详解(`add_library()` 作用域、`PRIVATE/PUBLIC/INTERFACE` 传递规则) │ ├── cmake-generator-expressions.7.html ← `$<CONFIG>`、`$<TARGET_FILE:xxx>` 等生成器表达式权威文档 │ └── index.html ← 文档首页(离线可用,无需联网) └── share/ ← 模块库(FindXXX.cmake、CMakePackageConfigHelpers.cmake 等) └── cmake-3.28/ └── Modules/提示:
doc/目录下的.html文件是离线调试的救命稻草。当你遇到CMake Error at CMakeLists.txt:42 (target_link_libraries): Cannot specify link interface for target "mylib" which is not built in this source directory这类报错时,直接打开cmake-buildsystem.7.html搜索target_link_libraries INTERFACE,比 Stack Overflow 上的碎片答案快 3 倍。
2.2 PATH 配置实操:拒绝choco install cmake,坚持手动注入
Windows 下 CMake 的 PATH 注入必须满足两个硬性条件:
cmake.exe所在目录(如C:\cmake-3.28.6-win64-x64\bin)必须加入系统级 PATH(非用户级),否则 GitHub Actions 或 Jenkins Agent 无法识别;- 不能与旧版 CMake(如 VS2022 自带的 3.21.2)共存于同一 PATH 位置,否则
where cmake会返回多个路径,导致cmake --version输出不可信。
操作步骤(管理员权限 PowerShell):
# 1. 创建永久安装目录(避免中文路径和空格) New-Item -Path "C:\cmake-3.28.6-win64-x64" -ItemType Directory -Force # 2. 解压 zip 到该目录(假设 zip 在 Downloads) Expand-Archive -Path "$env:USERPROFILE\Downloads\cmake-3.28.6-windows-x86_64.zip" -DestinationPath "C:\cmake-3.28.6-win64-x64" -Force # 3. 将 bin 目录追加到系统 PATH(注意:必须用 [Environment]::SetEnvironmentVariable,而非 $env:PATH) $oldPath = [Environment]::GetEnvironmentVariable("Path", "Machine") $newPath = "C:\cmake-3.28.6-win64-x64\bin;" + $oldPath [Environment]::SetEnvironmentVariable("Path", $newPath, "Machine") # 4. 验证(新开一个 CMD 或 PowerShell) cmake --version # 必须输出 3.28.6,且无警告参数说明:
-Force防止因目录已存在而中断;[Environment]::SetEnvironmentVariable("Path", ..., "Machine")是关键——它修改的是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path,确保所有服务进程(包括 Git Bash、WSL2 的 Windows interop)都能继承;where cmake应只返回一行:C:\cmake-3.28.6-win64-x64\bin\cmake.exe。
3. 构建实战:用 CMake 3.28.6 正确驱动 MSVC 2022 和 MinGW-w64
3.1 MSVC 2022:-A x64不再是默认,-T host=x64成为稳定锚点
CMake 3.28 强化了对 Visual Studio 2022 v17.8+ 的 generator 行为控制。旧写法cmake -G "Visual Studio 17 2022"会默认生成 Win32 平台项目(即使你在 x64 命令行中运行),导致LINK : fatal error LNK1104: cannot open file 'kernel32.lib'。正确姿势是显式绑定架构:
# ✅ 正确:强制 host 和 target 均为 x64,避免混用 x86 工具链 cmake -S . -B build-msvc -G "Visual Studio 17 2022" -A x64 -T host=x64 # ✅ 更推荐:使用 Ninja(启动快、增量构建准),搭配 MSVC 工具链 cmake -S . -B build-ninja -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -T host=x64关键参数解析:
-A x64:指定 target architecture(影响CMAKE_SIZEOF_VOID_P和CMAKE_SYSTEM_PROCESSOR);-T host=x64:指定 host toolchain architecture(决定cl.exe调用路径,避免vcvarsall.bat自动降级到 x86);-DCMAKE_BUILD_TYPE=RelWithDebInfo:对 Ninja generator 必需(VS generator 可省略,因其通过 ConfigurationName 控制);-G Ninja:CMake 3.28 对 Ninja 的build.ninja生成逻辑做了缓存优化,ninja -t deps输出更准确。
3.2 MinGW-w64:-G "MinGW Makefiles"已淘汰,-G "Ninja Multi-Config"是新标准
CMake 3.28 彻底弃用MinGW Makefilesgenerator(其make依赖 GNU Make,且无法处理add_compile_options(-march=native)的跨平台兼容)。取而代之的是:
# ✅ 正确:使用 Ninja + MinGW-w64 工具链文件(toolchain file) cmake -S . -B build-mingw -G "Ninja Multi-Config" \ -DCMAKE_TOOLCHAIN_FILE="C:/msys64/mingw64/share/cmake/toolchain/mingw64.cmake" \ -DCMAKE_BUILD_TYPE=Releasetoolchain file 示例(mingw64.cmake)关键片段:
set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_C_COMPILER "C:/msys64/mingw64/bin/gcc.exe") set(CMAKE_CXX_COMPILER "C:/msys64/mingw64/bin/g++.exe") set(CMAKE_FIND_ROOT_PATH "C:/msys64/mingw64") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 不在 root path 查找可执行文件 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # 只在 root path 查找库 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # 只在 root path 查找头文件注意:
CMAKE_FIND_ROOT_PATH_MODE_*三参数是 MinGW 构建不链接到C:\Windows\System32下user32.lib的核心防线。漏设会导致undefined reference to '__imp__MessageBoxA@16'。
4. 避坑指南:CMake 3.28.6 在 Windows 上的五个血泪经验
4.1 现象:CMake Error: The source directory ".../src" does not appear to contain CMakeLists.txt
原因:CMake 3.28 默认启用CMP0148策略(要求CMakeLists.txt必须位于-S指定目录的根目录,禁止cmake -S src -B build这种写法)。
解决:在CMakeLists.txt开头添加:
cmake_policy(SET CMP0148 NEW) # 允许 -S 指向子目录 # 或临时禁用策略(不推荐) # cmake_policy(SET CMP0148 OLD)4.2 现象:CMake Warning: Manually-specified variables were not used by the project: CMAKE_CXX_FLAGS
原因:CMake 3.28 强化了CMAKE_CXX_FLAGS的废弃警告(应改用target_compile_options()或add_compile_options())。
解决:将全局标志迁移至 target 级别:
# ❌ 旧写法(触发警告) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++20 /permissive-") # ✅ 新写法(无警告) add_compile_options(/std:c++20 /permissive-) # 或更推荐: target_compile_options(my_target PRIVATE /std:c++20 /permissive-)4.3 现象:Ninja: error: build.ninja:1234: bad $ escape
原因:CMakeLists.txt中使用了未转义的$符号(如set(VERSION "v1.$ENV{BUILD_NUMBER}")),CMake 3.28 的 Ninja backend 对$解析更严格。
解决:双写$或改用string(CONFIGURE):
# ❌ 错误 set(VER "v1.$ENV{BUILD_NUMBER}") # ✅ 正确(转义) set(VER "v1.$$ENV{BUILD_NUMBER}") # ✅ 更健壮(延迟展开) string(CONFIGURE "v1.\${BUILD_NUMBER}" VER @ONLY)4.4 现象:CMake Error: install(EXPORT "mytargets" ...) includes target "mylib" which requires a target export set
原因:install(EXPORT)要求所有被导出的 target 必须先通过export(TARGETS ... FILE ...)注册,CMake 3.28 对此校验更严格。
解决:在install(EXPORT)前补全 export:
# 必须先 export target 到文件 export(TARGETS mylib FILE "${CMAKE_BINARY_DIR}/mylib-targets.cmake") # 再 install export install(EXPORT mytargets FILE mylib-config.cmake NAMESPACE mylib:: DESTINATION lib/cmake/mylib)4.5 现象:CMake Warning: Manually-specified variables were not used by the project: CMAKE_INSTALL_PREFIX
原因:CMAKE_INSTALL_PREFIX是 cache 变量,但若CMakeLists.txt中未调用install()命令,CMake 3.28 会明确警告其未被消费。
解决:确认install()存在,或显式设置CMAKE_SKIP_INSTALL_ALL_DEPENDENCY=ON(仅调试用):
cmake -S . -B build -DCMAKE_INSTALL_PREFIX="C:/myproject/install" -DCMAKE_SKIP_INSTALL_ALL_DEPENDENCY=ON5. 进阶技巧:用cmake-file-api实现 IDE 无感同步,告别手动生成
5.1 什么是 CMake File API?——让 VS Code/CLion/Qt Creator 直接读取构建图谱
CMake 3.28 的cmake-file-api不是替代cmake-gui的图形工具,而是提供 JSON-RPC 接口,让 IDE 绕过cmake命令行调用,直接解析build/目录下的codemodel-v2文件,获取:
- 所有
target的源文件列表、编译选项、包含路径; target_link_libraries()的精确依赖链(含INTERFACE传递);configure_file()生成的头文件路径;add_custom_target()的执行命令与工作目录。
启用方式(无需修改 CMakeLists.txt):
# 1. 创建 build 目录并初始化 File API cmake -S . -B build -G Ninja # 2. 触发 File API 生成(生成 codemodel-v2 目录) cmake -B build --fresh # 3. 查看生成的 JSON(VS Code CMake Tools 插件自动读取此路径) ls build/.cmake/api/v1/reply/ # 输出类似:codemodel-v2-xxxxx.json, cache-v2-xxxxx.json5.2 手动解析 codemodel-v2:定位target_compile_definitions()的实际生效位置
当target_compile_definitions(mylib PRIVATE MYLIB_LOG_LEVEL=3)不生效时,GUI 工具只能显示“已设置”,而codemodel-v2能告诉你它到底被插到了哪一行编译命令里:
# 解析 codemodel-v2-*.json(用 jq) jq '.configurations[0].projects[0].targets[] | select(.name=="mylib") | .compileGroups[0].defines' build/.cmake/api/v1/reply/codemodel-v2-*.json输出示例:
["MYLIB_LOG_LEVEL=3", "CMAKE_BUILD_TYPE=\"RelWithDebInfo\""]这证明定义已注入,若仍不生效,问题必在:
- 头文件未
#include <mylib/config.h>; MYLIB_LOG_LEVEL被后续#undef覆盖;target_compile_definitions()作用域错误(PRIVATE不会传递给依赖者)。
5.3 验证 CMake 版本兼容性:用cmake-presets.json锁定构建环境
CMake 3.28 强制要求cmake-presets.json中的version字段必须 ≥ 3,否则cmake --list-presets报错。一个生产级 preset 示例:
{ "version": 4, "configurePresets": [ { "name": "win-msvc-release", "displayName": "Windows MSVC Release", "description": "Build with Visual Studio 2022 x64", "generator": "Visual Studio 17 2022", "binaryDir": "${sourceDir}/build-msvc-release", "cacheVariables": { "CMAKE_BUILD_TYPE": "RelWithDebInfo", "CMAKE_TOOLCHAIN_FILE": "" }, "condition": { "type": "equals", "lhs": "${hostSystemName}", "rhs": "Windows" } } ] }验证命令:
cmake --list-presets # 列出可用 preset cmake --preset win-msvc-release # 一键生成(自动处理 -S/-B/-G) cmake --build --preset win-msvc-release # 一键构建(自动选择 build dir)从那以后我每次新建 C++ 项目,都先写cmake-presets.json再动CMakeLists.txt——不是为了炫技,而是因为--preset能让实习生、外包、CI 流水线用同一串命令跑通,彻底消灭 “在我机器上是好的” 这句万能甩锅话。希望帮到你。
本文还有配套的精品资源,点击获取