简介:面向 Windows 平台 C/C++ 开发者与多平台构建需求者的 CMake 3.17.1 官方 64 位免安装包,解压后即可在命令行调用 cmake.exe,省去安装流程,尤其适合网络受限或需快速部署构建环境的场景。压缩包共 6169 个文件,约 32.47MB,以 txt、html、rst 文档和 cmake 模块脚本为主,另含少量 exe 可执行文件、json 配置、png 图示及 c、cxx、cpp 示例源码,覆盖手册、模块说明与工具链配置等用途。已有 1194 人学习下载。资源内含 cmake、ctest、cpack、ccmake 等命令行工具及 GUI 入口,并附带命令、属性、变量、策略等参考手册,便于读者查阅生成器用法、配置 MSVC 或 Ninja 构建流程,快速上手跨平台项目构建与依赖管理。
1. 解压就能用?先别急着双击 cmake-gui
上周帮一个做图像处理 Demo 的 A 同学看环境,他机器上装了三个版本的 CMake,where cmake出来一串路径,结果 VS 生成器死活找不到编译器。问题不在 CMake 本身,而在他把免安装包解压到了带空格和中文的目录里,还顺手把bin加进了系统 PATH 的最前面。cmake-3.17.1-win64-x64.zip 这种免安装包确实解压即用,但「能用」和「用得对」是两回事。这篇笔记按我自己的部署习惯走一遍:先确认环境、再解压落位、配 PATH、验证生成器、最后处理翻车现场。适合刚在 Windows 上搭 C/C++ 构建链的开发者,也适合想把 CMake 版本钉死在 3.17.1 的熟手。
2. 装前把环境列清楚:版本、编译器、路径三件事
免安装包省掉了安装向导,但省不掉环境判断。CMake 本身只是个构建系统生成器,它不编译代码,真正干活的是背后的编译器(MSVC、MinGW、Ninja 等)。所以装之前必须先把「CMake 版本 + 编译器 + 目录规划」这三件事定下来,否则后面生成阶段一定报No CMAKE_CXX_COMPILER could be found。
2.1 为什么钉在 3.17.1 这个版本
CMake 3.17 系列是 2020 年的稳定线,cmake-3.17.1-win64-x64.zip是官方为 64 位 Windows 打的免安装压缩包,解压后目录结构是bin/、share/、doc/这几层,bin里就是cmake.exe、cmake-gui.exe、ctest.exe、cpack.exe。选它通常有两个原因:一是老项目CMakeLists.txt里写了cmake_minimum_required(VERSION 3.17),用更高版本可能触发策略警告;二是某些第三方库的预编译脚本对 3.18 之后的FindXXX行为敏感。
需要提醒的是,3.17.1 对 Visual Studio 2019 的支持是完整的,生成器名是Visual Studio 16 2019;如果你机器上只有 VS2022,生成器要写Visual Studio 17 2022,但 3.17.1 对 VS2022 的识别并不在官方支持列表里,常见做法是仍用 3.17.1 配 VS2019,或者干脆升到 3.21+。这一点在选版本时就要想清楚,别装完才发现生成器对不上。
2.2 编译器先到位,CMake 才有意义
Windows 上最常见的两条路:MSVC(装 Visual Studio 或 Build Tools,勾选「使用 C++ 的桌面开发」)和 MinGW-w64(解压即用的 GCC 工具链)。CMake 3.17.1 对两者的支持都成熟,但配置方式不同:
| 编译器 | 生成器参数 | 额外要求 |
|---|---|---|
| MSVC 2019 | -G "Visual Studio 16 2019" -A x64 | 需装 VS2019 或 Build Tools |
| MinGW-w64 | -G "MinGW Makefiles" | mingw32-make.exe在 PATH 中 |
| Ninja + MSVC | -G Ninja | 需在 VS 开发者命令行里执行 |
我一般会先跑where cl和where gcc确认编译器可见。如果两个都没有,先装编译器,别急着解压 CMake——顺序反了,后面验证环节会一直卡在「找不到编译器」。
2.3 目录规划:别放中文和空格路径
这是血泪经验。CMake 生成的CMakeCache.txt里会记录绝对路径,路径里一旦有空格或中文,某些生成器和第三方脚本解析时会截断。我习惯把免安装包统一放到:
D:\tools\cmake\cmake-3.17.1-win64-x64\解压后bin的完整路径就是D:\tools\cmake\cmake-3.17.1-win64-x64\bin。这个路径全英文、无空格,后面配 PATH 和环境变量都省心。如果你机器上已经有别的 CMake 版本,建议用「版本号子目录」并列存放,比如D:\tools\cmake\3.17.1\和D:\tools\cmake\3.25.0\,切换时只改 PATH,不覆盖文件。
提示:解压工具建议用 7-Zip 或系统自带解压,别用某些会改写文件权限的第三方压缩软件,
cmake.exe被加上奇怪属性后偶发无法执行。
3. 解压与 PATH 配置:三个容易写错的路径
这一章是安装的主体。免安装包没有注册表、没有开始菜单,所有「安装」动作其实就两件:把文件放到规划好的目录,把bin暴露给命令行。听起来简单,但 PATH 的写法、顺序、作用域三个地方都容易翻车。
3.1 解压落位与目录自检
把cmake-3.17.1-win64-x64.zip解压到D:\tools\cmake\下,确认解压后不是多套了一层同名目录。常见情况是解压出cmake-3.17.1-win64-x64\cmake-3.17.1-win64-x64\bin,多一层会导致 PATH 写错。解压完先在资源管理器里点进bin,确认能看到cmake.exe,再继续。
然后用命令行做一次目录自检:
# 进入解压后的 bin 目录,确认核心可执行文件齐全 cd /d D:\tools\cmake\cmake-3.17.1-win64-x64\bin dir cmake.exe cmake-gui.exe ctest.exe cpack.exedir能列出四个文件说明包是完整的。如果只有cmake.exe没有ctest.exe,大概率是解压中断,重新解压即可。这一步花十秒,能省掉后面「命令存在但子命令缺失」的排查。
3.2 配 PATH:用户变量还是系统变量
PATH 有两个作用域:用户变量只对当前登录账户生效,系统变量对所有账户生效。个人开发机我一般配用户变量,避免影响其他账户;如果是共用构建机,配系统变量。操作路径是「此电脑 → 属性 → 高级系统设置 → 环境变量」,在「用户变量」里选中Path,点编辑,新增一行:
D:\tools\cmake\cmake-3.17.1-win64-x64\bin注意这里填的是bin目录,不是解压根目录。填根目录的话cmake命令根本找不到。另一个容易写错的是结尾不要带反斜杠,...\bin\在某些旧版命令行解析里会出问题,统一写成...\bin。
3.3 PATH 顺序决定你实际用的是哪个 CMake
如果机器上装过 Visual Studio,它自带的 CMake 可能已经在 PATH 里;如果装过其他版本,也会有旧路径。PATH 是从上往下找的,谁在前用谁。我习惯把要用的版本放在最前面,或者干脆把旧版本路径删掉。验证顺序是否生效:
# 新开一个命令行窗口(PATH 修改不会影响已打开的窗口) where cmake cmake --versionwhere cmake应该只输出一行,指向D:\tools\cmake\cmake-3.17.1-win64-x64\bin\cmake.exe;cmake --version应该回显cmake version 3.17.1。如果where出来多行,说明还有别的 CMake 在 PATH 里,按顺序决定去留。这里有个玄学现象:改了 PATH 但cmake --version还是旧版本,九成是没重开命令行窗口,环境变量是进程启动时读取的。
注意:不要同时把
bin和bin下的子目录都加进 PATH,重复项会让where输出多行,排查时容易误判。
3.4 可选:设 CMAKE_ROOT 与生成器默认值
免安装包不设CMAKE_ROOT也能跑,因为cmake.exe会根据自身位置推断share/cmake-3.17模块目录。但如果你的脚本里会移动cmake.exe或做符号链接,建议显式设一个用户变量:
CMAKE_ROOT = D:\tools\cmake\cmake-3.17.1-win64-x64另外可以设CMAKE_GENERATOR指定默认生成器,省得每次敲-G。我一般不在全局设,因为不同项目生成器不同,全局设了反而容易在跨项目时踩坑。真要设,就在具体项目的构建脚本里设,别污染全局环境。
4. 验证生成器与编译器:一次跑通的最小工程
PATH 配好只是「命令能用」,真正要验证的是「CMake 能不能找到编译器并生成构建文件」。这一步用最小工程跑一遍,比任何文档都直观。
4.1 写一个最小 CMakeLists.txt
在D:\work\cmake-test下建两个文件。CMakeLists.txt:
cmake_minimum_required(VERSION 3.17) project(hello_cmake CXX) add_executable(hello main.cpp)main.cpp:
#include <iostream> int main() { std::cout << "cmake 3.17.1 ok" << std::endl; return 0; }cmake_minimum_required(VERSION 3.17)和包版本对齐,避免策略警告;project(hello_cmake CXX)只启用 C++,减少对 C 编译器的探测,验证更快。
4.2 用 MSVC 生成并构建
打开「x64 Native Tools Command Prompt for VS 2019」(这一步很关键,普通 cmd 里cl不在 PATH),进入工程目录:
cd /d D:\work\cmake-test cmake -S . -B build -G "Visual Studio 16 2019" -A x64 cmake --build build --config Release-S .指定源码目录,-B build指定构建目录(3.13 之后支持,3.17.1 完全可用),-G指定生成器,-A x64指定目标架构。生成成功会看到Build files have been written to: .../build。构建成功后build\Release\hello.exe就是产物,直接运行应输出cmake 3.17.1 ok。
4.3 用 MinGW 生成并构建
如果走 MinGW 路线,确保gcc、g++、mingw32-make都在 PATH,然后:
cd /d D:\work\cmake-test cmake -S . -B build-mingw -G "MinGW Makefiles" cmake --build build-mingwMinGW Makefiles生成器会调用mingw32-make.exe。如果报CMAKE_MAKE_PROGRAM not found,就是mingw32-make没进 PATH,把 MinGW 的bin加进去再重开窗口。两个生成器都跑通,说明这套免安装 CMake 的编译器探测链路是完整的。
4.4 看 CMakeCache.txt 确认实际用的编译器
生成之后别急着关窗口,打开build\CMakeCache.txt,搜CMAKE_CXX_COMPILER:,确认它指向你预期的cl.exe或g++.exe。这是排查「生成成功但编译报错」的第一现场——很多时候生成器选对了,但 CMake 缓存里记的是上一次的编译器路径,导致链接阶段找不到库。缓存不对就删掉整个build目录重新生成,别手动改 Cache 文件。
5. 避坑与排查:五条装完才发现的坑
免安装包的坑集中在「路径、缓存、生成器、权限」四类。下面五条是我和周围人真实踩过的,按现象、原因、解决写清楚。
5.1 现象:cmake不是内部或外部命令
原因:PATH 没生效,或者填的是解压根目录而不是bin。解决:重开命令行窗口;用echo %PATH%看路径是否包含...\bin;确认路径拼写没有多一层同名目录。如果用的是 PowerShell,注意它读的是同一套环境变量,但已打开的窗口同样需要重启。
5.2 现象:生成时报No CMAKE_CXX_COMPILER could be found
原因:当前命令行环境里没有编译器。MSVC 需要在 VS 开发者命令行里跑,普通 cmd 里cl不可见;MinGW 则是g++没进 PATH。解决:MSVC 换用「x64 Native Tools Command Prompt」;MinGW 把工具链bin加进 PATH 后重开窗口,再删build重新生成。
5.3 现象:改了 CMakeLists 但构建行为没变
原因:CMakeCache.txt缓存了旧变量,尤其是切换生成器或编译器后没清缓存。解决:删掉整个构建目录重新cmake -S . -B build。我一般会在构建脚本里加一句「换生成器必删 build」的注释,避免自己忘。
5.4 现象:路径含中文或空格时生成失败
原因:部分生成器和第三方Find脚本对含空格路径解析不完整。解决:把工程和 CMake 都放到全英文无空格路径下,比如D:\work\和D:\tools\。这是最省事的做法,别去改脚本转义,转义在不同生成器下行为不一致。
5.5 现象:cmake-gui打开后配置项是灰的
原因:cmake-gui启动时读取的环境和命令行不一致,或者上一次配置残留。解决:在 GUI 里先点「Delete Cache」清掉,再重新「Configure」;如果仍灰,检查是不是以普通用户启动但工程目录在需要管理员权限的位置,换到用户目录下再试。
6. 装完怎么验证跑通:三步验收与一个习惯
验收别只看cmake --version,那只证明命令在。我习惯走三步:版本对、生成器对、产物能跑。
第一步,版本与路径验收:
where cmake cmake --version期望输出单行路径和cmake version 3.17.1。多行就回去清 PATH。
第二步,生成器清单验收:
cmake --help在输出里找Generators段,确认Visual Studio 16 2019和MinGW Makefiles都在列表里。这一步能提前发现「包不完整」或「版本被覆盖」的问题。
第三步,最小工程端到端验收,就是第 4 章那套-S . -B build加--build,产物运行输出预期字符串。三步都过,这套免安装环境才算真正落地。
| 验收项 | 命令 | 通过标准 |
|---|---|---|
| 版本 | cmake --version | 回显 3.17.1 |
| 路径唯一 | where cmake | 仅一行,指向解压 bin |
| 生成器 | cmake --help | 含目标生成器 |
| 端到端 | 最小工程构建 | 产物可运行 |
从那以后我每次配免安装工具链,都强制先跑一遍where加最小工程,再往真实项目上套——因为真实项目的报错信息往往指向业务代码,实际根因却在环境。这套流程花不到五分钟,能挡掉后面几小时的瞎猜。希望帮到你。
本文还有配套的精品资源,点击获取