
简介CMake 3.25 Windows 版是面向 C 开发者与跨平台构建需求者的自动化构建工具安装包适用于在 Visual Studio、MinGW 等编译器环境下配置和生成项目文件帮助管理复杂工程结构、简化构建流程。压缩包共 7090 个文件约 36.31MB以 txt、html、rst 文档和 cmake 模块脚本为主另含少量 exe 可执行文件、json 配置、png 图标及 c、cxx、cpp 等示例源码覆盖命令行工具、GUI 程序与模块说明文档。已有 1333 人学习下载。该版本在兼容性、新增命令选项、性能优化、错误提示、缓存管理及脚本语言等方面均有增强安装后可通过 CLI 或 GUI 直观设置源码路径、构建目录与编译器选项适合需要稳定构建环境的中高级 C 开发者参考使用。1. 为什么 Windows 上装 CMake 3.25 值得单独写一篇在 Windows 上做 C 开发很多人第一次被卡住不是卡在语法而是卡在构建工具链。Visual Studio 自带的 MSBuild 能跑但一旦项目要跨平台、要接第三方库、要在 CI 上跑CMake 就成了绕不开的那一环。CMake 3.25 这个版本在 Windows 上是个比较稳的落点它原生支持FetchContent的SYSTEM属性、block()作用域命令、以及SYSTEM包含目录的细粒度控制这些在拉第三方依赖时能省掉不少手动改include_directories的麻烦。这篇不是讲 CMake 语法课而是把「Windows 上拿到 CMake 3.25、装好、配好、跑通一个真实工程」这条链路拆开顺带把cmake error at .../CMakeDetermineCompilerId.cmake这类高频翻车点讲清楚。适合两类人刚在 Windows 上从 IDE 转向命令行构建的以及被 Qt、OpenCV 这类库的 CMake 配置折磨过的。2. 拿到 CMake 3.25 Windows 包选 zip 还是 installer2.1 两种分发形式的实际差别CMake 官方在 Windows 上给的是两种东西一个是.msi安装器一个是.zip压缩包。很多人随手点 msi装完发现 PATH 被改了、旧版本被覆盖回头想切回 3.20 又得卸载重装。zip 包解压即用目录里就是bin/cmake.exe、bin/cmake-gui.exe、share/cmake-3.25/Modules这一整套不写注册表、不动系统 PATH适合同时维护多个项目、每个项目锁不同 CMake 版本的场景。判断该用哪个看一条你的机器上是不是只有一个 C 项目、且不介意全局升级。是就 msi不是就 zip。我自己的习惯是 zip 解压到D:\tools\cmake-3.25.3-windows-x86_64然后在需要它的终端里临时把bin加到 PATH 最前面这样不会污染系统里其他工具链。2.2 解压后的目录结构与校验zip 包解开后核心目录长这样路径作用bin/cmake.exe命令行主程序构建脚本调的就是它bin/cmake-gui.exe图形界面配交叉编译和首次 configure 时好用bin/ctest.exe测试驱动配合enable_testing()用bin/cpack.exe打包生成 installer 或 zipshare/cmake-3.25/Modules内置模块FindXXX.cmake都在这share/cmake-3.25/Help离线文档查命令参数比翻网页快拿到包之后先做一步校验别急着用。在解压目录开一个 PowerShell# 进入解压出来的 bin 目录 cd D:\tools\cmake-3.25.3-windows-x86_64\bin # 直接跑版本确认可执行文件没被杀软截断 .\cmake.exe --version # 看内置模块路径是否指向当前目录而不是系统里别的 CMake .\cmake.exe --system-information | Select-String CMAKE_ROOT--version输出里应该能看到cmake version 3.25.x。如果这里报「不是内部或外部命令」多半是路径里有空格或中文换个纯英文短路径。--system-information那行是为了确认CMAKE_ROOT指向的是你刚解压的这份而不是系统里残留的旧版本——这一步能提前排掉后面「明明装了 3.25 却报 3.20 语法不支持」的玄学问题。2.3 把 3.25 挂进当前终端而不污染全局不推荐直接改系统环境变量尤其是公司机器上还跑着别的构建系统。做法是在项目根目录放一个env.ps1每次开终端先 source 一下# env.ps1 —— 只对当前 PowerShell 会话生效 $cmakeRoot D:\tools\cmake-3.25.3-windows-x86_64 $env:PATH $cmakeRoot\bin; $env:PATH # 顺手把 Ninja 也挂上后面生成器要用 $env:PATH D:\tools\ninja; $env:PATH cmake --version这样做的逻辑是PATH 是进程级环境变量改它只影响当前这个终端窗口关掉就恢复。参数上唯一要改的是$cmakeRoot换成你自己的解压路径。跑完cmake --version确认输出是 3.25再往下走。如果团队里多人协作把这个脚本提交到仓库比在文档里写「请安装 CMake 3.25」靠谱得多。3. 用 CMake 3.25 跑通第一个 Windows 工程3.1 最小 CMakeLists 与生成器选择先建一个能跑的最小工程目录结构就三个文件hello/ ├── CMakeLists.txt └── src/ └── main.cppCMakeLists.txt内容# 最低版本卡在 3.25低于它的 CMake 会直接报错退出 cmake_minimum_required(VERSION 3.25) # 工程名和语言CXX 表示只启用 C project(hello LANGUAGES CXX) # 要求 C17MSVC 下会自动加 /std:c17 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 把 src 下的源文件收进来生成可执行文件 add_executable(hello src/main.cpp)cmake_minimum_required(VERSION 3.25)这行不是摆设。它决定了 CMake 用哪套策略policy来解释你的脚本。写低了3.25 的新行为不会生效写高了老版本 CMake 直接拒绝配置。卡在 3.25 意味着你明确要求「至少这个版本」团队里谁用 3.20 就会在 configure 阶段被拦下而不是等到编译才出莫名其妙的错。生成器这块Windows 上常见三种Visual Studio 生成器、Ninja、MinGW Makefiles。VS 生成器不用额外装东西但生成的是.sln构建慢Ninja 快但要单独下ninja.exe。我一般开发阶段用 Ninja出包用 VS 生成器。3.2 configure 与 build 两条命令在hello/目录下开终端先 configure# -S 指定源码目录-B 指定构建目录-G 指定生成器 cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPERelease # 构建 cmake --build build-S .是源码根-B build把中间产物全丢进build/源码目录保持干净删构建直接删build就行。-G Ninja指定生成器前提是ninja.exe在 PATH 里否则会报「CMAKE_MAKE_PROGRAM not set」。-DCMAKE_BUILD_TYPERelease在单配置生成器Ninja、Makefiles下才有效VS 生成器是多配置的这个变量会被忽略得在 build 时用--config Release。构建完可执行文件在build/hello.exe。跑一下确认.\build\hello.exe如果 configure 阶段报CMake Error at .../CMakeDetermineCompilerId.cmake:9先别慌这是 Windows 上最高频的报错之一下一章专门拆。3.3 接一个第三方库以 FetchContent 拉 fmt 为例CMake 3.25 里FetchContent已经比较成熟配合SYSTEM属性可以把第三方库的头文件当系统头处理压掉一堆警告。写进CMakeLists.txtinclude(FetchContent) # 声明要拉取的依赖GIT_TAG 锁版本别用 master FetchContent_Declare( fmt GIT_REPOSITORY https://github.com/fmtlib/fmt.git GIT_TAG 10.1.1 GIT_SHALLOW TRUE ) # 3.25 支持 SYSTEM 参数把 fmt 的头当系统头警告不冒出来 FetchContent_MakeAvailable(fmt) add_executable(hello src/main.cpp) target_link_libraries(hello PRIVATE fmt::fmt)GIT_TAG一定要锁具体 tag用master意味着别人今天能编、明天可能就编不过。GIT_SHALLOW TRUE只拉最近一次提交省带宽。FetchContent_MakeAvailable在 3.25 里会把依赖的CMakeLists.txt一起处理fmt::fmt这个 target 直接可用。参数上唯一要动的是GIT_TAG换成你要的版本号。如果公司网络访问 GitHub 不稳常见做法是先把仓库镜像到内网 Git再把GIT_REPOSITORY换成内网地址其余不动。4. 避坑Windows 上 CMake 3.25 的五个高频翻车点4.1 CMakeDetermineCompilerId.cmake 报错现象configure 阶段直接停在CMakeDetermineCompilerId.cmake:9提示找不到编译器或编译器无法识别。原因CMake 在探测编译器时会真的编译一个测试文件如果 PATH 里没有cl.exeMSVC或g.exeMinGW或者 VS 环境变量没加载探测就失败。解决用 MSVC 的话别在普通 cmd 里直接跑 cmake先从开始菜单开「x64 Native Tools Command Prompt for VS」那个终端里cl.exe已经在 PATH 上。或者手动跑vcvars64.bat再执行 cmake。用 MinGW 的话确认g --version能输出且-G MinGW Makefiles和编译器匹配。4.2 Qt5Config.cmake 找不到现象报CMake Error at .../Qt5/Qt5Config.cmake说 Qt5 没找到。原因Qt 的 CMake 配置文件不在默认搜索路径里CMake 不知道去哪找。解决configure 时显式给-DCMAKE_PREFIX_PATH指向 Qt 安装目录cmake -S . -B build -G Ninja -DCMAKE_PREFIX_PATHC:/Qt/5.15.2/msvc2019_64路径用正斜杠或双反斜杠别用单反斜杠否则会被当转义符。Qt 版本和编译器位数要对上msvc2019_64 的 Qt 不能配 32 位编译器。4.3 生成器与编译器不匹配现象configure 过了build 时报一堆链接错误或者提示CMAKE_CXX_COMPILER和生成器冲突。原因Ninja 本身不绑定编译器但如果你之前用 VS 生成器配过同一个 build 目录缓存里存了旧的编译器路径换生成器后缓存没清。解决换生成器或换编译器时直接删掉build/重新 configure别在旧缓存上硬改。CMake 的缓存CMakeCache.txt会记住第一次 configure 的编译器改-G不会自动清。4.4 路径里有空格或中文现象configure 报奇怪的路径解析错误或者FetchContent拉下来的依赖编译失败。原因Windows 路径带空格时某些老脚本没加引号参数被拆开中文路径在部分工具链下编码不一致。解决源码目录、构建目录、CMake 解压目录全部用纯英文无空格路径。这条是血泪经验别图省事放桌面或「我的文档」。4.5 多配置生成器的 build type现象用 VS 生成器-DCMAKE_BUILD_TYPERelease写了但没生效出来的还是 Debug。原因VS 生成器是多配置的CMAKE_BUILD_TYPE对它无效得在 build 阶段指定。解决cmake --build build --config Release单配置生成器Ninja、Makefiles用-DCMAKE_BUILD_TYPE多配置生成器VS用--config两者别混。5. 进阶用 CMakePresets 把 3.25 的配置固化下来CMake 3.25 对CMakePresets.json的支持已经很完整这是把「我机器上能编」变成「谁 clone 下来都能编」的关键。以前靠 README 写一堆命令现在把配置写进CMakePresets.json别人一条cmake --preset就完事。在工程根目录建CMakePresets.json{ version: 6, configurePresets: [ { name: ninja-release, generator: Ninja, binaryDir: ${sourceDir}/build/release, cacheVariables: { CMAKE_BUILD_TYPE: Release, CMAKE_CXX_STANDARD: 17 } }, { name: vs2022, generator: Visual Studio 17 2022, architecture: x64, binaryDir: ${sourceDir}/build/vs } ], buildPresets: [ { name: ninja-release, configurePreset: ninja-release }, { name: vs2022-release, configurePreset: vs2022, configuration: Release } ] }version: 6对应 CMake 3.25 支持的 presets schema写低了有些字段不认。binaryDir用${sourceDir}变量保证不同机器上路径自动展开。configurePresets里ninja-release走单配置vs2022走多配置buildPresets里vs2022-release用configuration字段指定 Release正好对应上一章说的多配置差异。用的时候# 按 ninja-release 预设配置 cmake --preset ninja-release # 按对应预设构建 cmake --build --preset ninja-release验证 presets 有没有生效看build/release/CMakeCache.txt里CMAKE_BUILD_TYPE是不是 Release以及CMAKE_GENERATOR是不是 Ninja。如果cmake --preset报「Could not read presets」检查 JSON 有没有多余逗号以及 CMake 版本是不是真的 3.25——presets 的 schema 版本和 CMake 版本是绑的3.20 读不了 version 6。还有一个我常用的技巧把CMakeUserPresets.json加进.gitignore让每个人可以在里面放自己机器特有的路径比如 Qt 安装位置、内网 Git 地址而CMakePresets.json提交到仓库保持通用。这样团队共享一套基础配置个人差异不互相干扰。从那以后我每次新建 Windows C 工程第一件事不是写代码而是先把CMakePresets.json和env.ps1建好把 CMake 版本、生成器、编译器路径全钉死再动手写CMakeLists.txt。这样后面接第三方库、上 CI、换机器都不会因为环境差异返工。希望帮到你。本文还有配套的精品资源点击获取