简介:面向 Windows 平台 C/C++ 开发者与多平台构建需求者的 CMake 3.17.1 官方 64 位免安装包,解压即可使用,省去安装程序与网络受限时的下载等待,适合需要快速搭建构建环境、管理 CMakeLists.txt 工程的中级开发者。压缩包共 6169 个文件,约 32.47MB,以 txt、html、rst 文档和 cmake 模块脚本为主,另含少量 exe 可执行文件、json 配置、png 图示及 c、cxx、cpp 示例源码,覆盖命令行手册、模块说明与示例工程等用途。已有 1194 人学习下载。解压后 bin 目录内含 cmake.exe 等工具,可直接加入 PATH 调用,配合 MSBuild、Ninja 或 Visual Studio 生成器完成项目配置;随包文档涵盖 ctest、cpack、cmake-gui 及命令、属性、变量、策略等手册页,便于查阅生成器用法与模块细节,快速上手跨平台构建流程。
1. 解压就能用?先别急着双击 cmake-gui.exe
上周帮一位做嵌入式的朋友收拾一台新装的 Windows 开发机,他上来就把cmake-3.17.1-win64-x64.zip解压到桌面,双击cmake-gui.exe,结果 Configure 阶段直接报找不到编译器,折腾一下午没进展。这场景太常见了——CMake 本身不是编译器,它只是个构建系统生成器,免安装包省掉的是安装向导,不是环境依赖。3.17.1 这个版本在 Windows 上属于「老而稳」的一档,很多老项目、老 SDK 的 CMakeLists 就卡在 3.17 的语法边界上,装新版本反而会触发cmake_minimum_required的兼容警告。这篇笔记按「解压 → 配环境变量 → 接编译器 → 验证」的顺序走一遍,适合刚在 Windows 上搭 C/C++ 构建链的开发者,也适合手里有一堆老工程、不想被新版 CMake 策略折腾的熟手。
2. 版本与目录规划:3.17.1 免安装包该放哪
2.1 为什么选 3.17.1 这个免安装包
CMake 的 Windows 发行包分两类:带安装向导的.msi和纯解压的.zip。免安装包的好处是不写注册表、不碰系统目录,删掉文件夹就等于卸载干净,适合多版本并存或者没有管理员权限的机器。3.17.1 是 2020 年上半年的版本,cmake_minimum_required(VERSION 3.17)及以下的老工程都能正常处理,而 3.20 之后对策略和生成器行为做了不少调整,老工程迁移时容易冒出CMP0077、CMP0091之类的策略警告。我一般会把它当成「老项目专用 CMake」单独放一份,不和系统里可能存在的其他版本混用。
解压前先确认包结构。正常解压后顶层目录是cmake-3.17.1-win64-x64,里面bin、share、doc三个子目录,bin下有cmake.exe、cmake-gui.exe、ctest.exe、cpack.exe。如果解压出来多套了一层同名目录,说明压缩包本身带了一层包裹,后面配路径时容易多写一级,这是第一个小坑。
2.2 目录放哪、路径怎么定
不要把 CMake 放在桌面、下载目录或者带中文、空格的路径下。构建系统在调用编译器时会拼接大量绝对路径,路径里有空格或中文,某些老版本生成器(尤其是 Visual Studio 生成器)会在引号处理上翻车。我习惯统一放在一个短路径下,比如:
D:\tools\cmake\3.17.1\ bin\ share\ doc\也就是把解压出来的cmake-3.17.1-win64-x64内容直接铺到3.17.1这一层,或者保留原目录名也行,关键是最终cmake.exe所在的bin目录路径要短、纯英文、无空格。如果以后要并存 3.25 之类的版本,就在D:\tools\cmake\下再建一个3.25.x目录,靠环境变量切换,而不是覆盖。
提示:解压工具建议用系统自带的资源管理器或 7-Zip,不要用某些会改写文件权限的第三方解压器,否则
bin下的 exe 可能丢失执行权限,表现为双击闪退。
2.3 解压后的自检清单
解压完先别配环境变量,进bin目录手动跑一次版本查询,确认包本身没坏:
# 在解压目录的 bin 下打开 cmd,执行 cmake --version正常输出第一行是cmake version 3.17.1。如果提示「不是内部或外部命令」,说明当前目录不对或者 exe 损坏;如果输出的是别的版本号,说明系统 PATH 里已经有一个 CMake 抢先被命中了,这正是下一章要处理的问题。这一步的意义在于把「包坏了」和「路径没配对」两类问题提前分开,省得后面在构建报错里绕圈。
3. 配置环境变量:PATH 的写法与优先级
3.1 把 bin 目录写进 PATH
免安装包不写注册表,所以系统不知道cmake在哪,必须手动把bin目录加进用户环境变量。操作路径是「此电脑 → 属性 → 高级系统设置 → 环境变量 → 用户变量 → Path → 编辑 → 新建」,填入:
D:\tools\cmake\3.17.1\bin注意填的是bin这一级,不是3.17.1这一级,也不是cmake.exe的完整文件名。填错层级是最常见的翻车点:填到上一级,命令行里敲cmake找不到;填成 exe 全路径,PATH 机制根本不认。
改完必须新开一个 cmd 或 PowerShell 窗口,旧窗口的环境变量是启动时快照的,不会自动刷新。新窗口里执行:
where cmake输出应该是D:\tools\cmake\3.17.1\bin\cmake.exe,且只有这一行。如果出现多行,说明机器上还有别的 CMake,需要决定谁优先。
3.2 多版本并存时的优先级处理
PATH 是从上到下匹配的,排在前面的目录先命中。如果机器上已经装了某个.msi版 CMake,它的路径通常写在系统变量 Path 里,而用户变量 Path 的优先级低于系统变量(在多数 Windows 版本上,系统 Path 先于用户 Path 参与拼接)。这时候你新加的用户路径可能被系统路径压住,where cmake仍然指向旧版本。
处理办法有两个:一是把 3.17.1 的bin也加到系统变量 Path 的最前面;二是干脆在项目里不依赖全局cmake,改用绝对路径调用。我一般选后者,因为改系统 Path 影响面大,而且团队协作时每个人的机器环境不一样,写死绝对路径反而可复现。可以在项目根目录放一个小的批处理或者构建脚本,里面显式指定:
@echo off set CMAKE_BIN=D:\tools\cmake\3.17.1\bin\cmake.exe "%CMAKE_BIN%" -S . -B build -G "Visual Studio 16 2019" -A x64-S指定源码目录,-B指定构建目录,-G选生成器,-A指定平台架构。这样即使系统里还有别的 CMake,这个脚本跑起来用的永远是 3.17.1,排查问题时变量少一个。
3.3 验证环境变量是否真的生效
配完 PATH 后做三层验证,一层比一层严格:
# 第一层:命令能否解析 where cmake # 第二层:版本号是否为目标版本 cmake --version # 第三层:生成器列表里能否看到目标编译器 cmake --help第三层输出末尾会列出当前 CMake 支持的生成器,比如Visual Studio 16 2019、Ninja、MinGW Makefiles。如果列表里没有你打算用的生成器,说明这个 CMake 版本和本机编译器组合不匹配,问题不在 PATH,而在编译器安装,下一章展开。
注意:
cmake --version的输出里如果带rc或dirty字样,说明拿到的是预发布构建,正式项目别用,换回正式发布包。
4. 接上编译器:Windows 下三种常见组合
4.1 组合一:Visual Studio 生成器(最省事)
CMake 在 Windows 上最顺的组合是直接调用 Visual Studio 的生成器,不需要手动配CC/CXX,CMake 会自己去注册表里找已安装的 VS 实例。以 VS 2019 为例:
cmake -S . -B build -G "Visual Studio 16 2019" -A x64-G后面的字符串必须和cmake --help里列出的完全一致,大小写、空格都不能改。-A x64指定目标平台,不写的话默认可能是 Win32,编出来的库位数不对,链接阶段才会暴露,属于典型的「前面都过、最后一步炸」。如果机器上装的是 VS 2022,生成器名要换成Visual Studio 17 2022,但 3.17.1 对 VS 2022 的支持并不完整,常见做法是 3.17.1 配 VS 2019,或者升级 CMake 版本,别硬凑。
4.2 组合二:Ninja + MSVC(构建快,但要进开发者命令行)
Ninja 构建速度快,但前提是编译器环境已经就绪。直接用普通 cmd 跑 Ninja 生成器,CMake 找不到cl.exe,报No CMAKE_CXX_COMPILER could be found。正确做法是从开始菜单打开「x64 Native Tools Command Prompt for VS 2019」,这个快捷方式会预先设好INCLUDE、LIB、PATH,然后再执行:
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release cmake --build build-DCMAKE_BUILD_TYPE=Release对单配置生成器(Ninja、Makefiles)才有意义,对 VS 这种多配置生成器会被忽略,这是新手常混的点。cmake --build build是跨生成器的统一构建入口,比手动敲ninja或msbuild更稳。
4.3 组合三:MinGW-w64(免装 VS 的轻量路线)
不想装几个 G 的 VS,可以用 MinGW-w64。前提是 MinGW 的bin也在 PATH 里,且gcc --version、g++ --version能正常输出。然后指定生成器:
cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++显式传CMAKE_C_COMPILER和CMAKE_CXX_COMPILER是为了避免 CMake 在多个候选编译器之间猜错。MinGW 路线在 Windows 上处理路径分隔符和运行时库时偶有玄学问题,尤其是涉及std::filesystem的老版本 GCC,建议 GCC 版本不低于 8。三条路线里,VS 生成器最省心,Ninja 最快,MinGW 最轻,按机器条件选一条走通即可,不要三条混着配。
5. 避坑与排查:五条血泪记录
5.1 现象:Configure 报找不到编译器
原因通常是生成器和编译器环境不匹配,比如在普通 cmd 里选了 Ninja 却没进开发者命令行,或者选了 MinGW 生成器但 PATH 里没有gcc。解决:先用where cl或where gcc确认编译器可见,再决定生成器;VS 生成器不需要cl在 PATH 里,因为它走注册表发现,这一点和 Ninja 相反,别用同一套判断标准。
5.2 现象:路径里有中文或空格,构建中途报错
原因是老版本生成器在拼接命令行时对引号处理不严,路径里的空格被当成参数分隔符。解决:把源码目录、构建目录、CMake 安装目录全部迁到纯英文短路径下,比如D:\work\proj。已经建好的构建目录不要原地改路径,删掉build重新生成,缓存里存的是旧绝对路径,改不干净。
5.3 现象:where cmake指向了别的版本
原因是系统 Path 里已有 CMake,且优先级高于用户 Path。解决:用where cmake列出全部命中项,按第 3.2 节的办法用脚本显式指定绝对路径,或者调整 Path 顺序。不要靠「卸载旧版本」解决,团队机器上旧版本可能是别的工具链依赖的。
5.4 现象:改了 PATH 但命令行没反应
原因是旧终端窗口持有旧环境快照。解决:关掉所有 cmd、PowerShell、VS 打开的终端,重新开一个。VS 内部集成的终端也要重启,它继承的是 IDE 启动时的环境。这条踩过不止一次,属于纯记忆型坑。
5.5 现象:构建目录残留导致重复报错
原因是上一次 Configure 失败后CMakeCache.txt里留下了错误的编译器路径或生成器信息,下次 Configure 直接复用缓存。解决:删掉整个build目录重新来,或者至少删CMakeCache.txt和CMakeFiles。我一般直接删build,比逐个文件判断快,反正构建产物可以重建。
6. 装完怎么验证:三步跑通一个最小工程
验证不要拿真实项目试,先建一个最小工程把链路跑通。在D:\work\hello下放两个文件:
hello/ CMakeLists.txt main.cppCMakeLists.txt内容:
cmake_minimum_required(VERSION 3.17) project(hello CXX) add_executable(hello main.cpp)main.cpp内容:
#include <iostream> int main() { std::cout << "cmake 3.17.1 ok" << std::endl; return 0; }然后按你选定的组合执行。以 VS 2019 为例:
cd /d D:\work\hello cmake -S . -B build -G "Visual Studio 16 2019" -A x64 cmake --build build --config Release build\Release\hello.exe三步的预期结果分别是:第一步输出Configuring done、Generating done;第二步输出hello.vcxproj -> ...\hello.exe;第三步打印cmake 3.17.1 ok。任何一步失败,回到对应章节查:第一步失败看生成器和编译器,第二步失败看源码和链接,第三步失败看运行时库位数是否匹配。
再补一个版本一致性检查,确认构建时用的确实是 3.17.1 而不是系统里别的版本:
cmake --system-information | findstr /C:"CMAKE_VERSION"输出里应包含CMAKE_VERSION "3.17.1"。这一步能抓出「PATH 配了但被覆盖」的隐性错误,比只看cmake --version更可靠,因为--system-information反映的是实际参与配置的那个 CMake 实例。
从那以后我每次在新机器上铺这套免安装 CMake,都强制先跑一遍这个最小工程,再碰真实项目——最小工程跑通只花两分钟,却能挡掉后面几小时的构建报错。希望帮到你。
本文还有配套的精品资源,点击获取