☰
CMake 3.25 Windows实战:C++项目构建配置与避坑指南
2026/10/14 13:15:05 网站建设 项目流程

简介:CMake 3.25 Windows 版本面向在 Windows 平台进行 C++ 开发的工程师与学习者,用于跨平台自动化构建与项目管理。无论使用 Visual Studio、MinGW 还是其他编译器,均可通过生成 .sln 或 .ninja 等工程文件,在熟悉的 IDE 中完成配置与构建。该版本在兼容性、新增命令与选项、性能优化、错误提示、缓存管理及脚本语言等方面均有增强,可简化复杂项目结构、缩短构建时间。压缩包共 7090 个文件,约 36.31MB,以 txt、html、rst 文档和 cmake 模块为主,另含少量 c、cxx、cpp 源码示例及 exe、bat、sh 等可执行与脚本文件,覆盖命令行、GUI 及模块文档等完整内容。已有 1334 人学习下载,适合需要稳定构建环境、查阅官方模块说明或研究 CMake 脚本用法的开发者参考使用。

1. CMake 3.25 Windows 版本:为什么它成了 C++ 项目构建的分水岭

如果你在 Windows 上写 C++,大概率经历过这样的场景:手写 Makefile 写到怀疑人生,换台机器编译就报找不到头文件,团队里有人用 Visual Studio、有人用 VS Code、有人用 CLion,构建脚本各写各的。CMake 3.25 的 Windows 版本,就是冲着这些痛点来的——它不是简单的版本号加一,而是把「跨 IDE、跨编译器、跨目录」这件事真正做扎实的一个节点。

这个版本在 Windows 上最值得关注的变化,是FetchContent的成熟、SYSTEM属性的完善,以及对 Visual Studio 17 2022 生成器的稳定支持。换句话说,你可以用一套 CMakeLists.txt,同时喂给 MSVC、MinGW、Ninja,甚至 WSL 里的 GCC。适合谁?适合那些项目开始膨胀、依赖开始变多、团队开始扩大的 C++ 开发者。如果你还在用单文件g++ main.cpp过日子,这篇文章可以先收藏,等你的项目超过 10 个源文件再回来看。

2. 在 Windows 上把 CMake 3.25 装对:三条路径与选择逻辑

2.1 为什么安装方式会影响后续构建

Windows 上装 CMake 有三条主流路径:官方 installer、包管理器(winget / chocolatey / scoop)、以及随 Visual Studio 附带的版本。很多人随手一装,结果后面cmake --version显示的是 3.20 甚至更老,或者 PATH 里有两个 cmake.exe 打架。CMake 3.25 对 Windows 的改进,比如更好的$<TARGET_RUNTIME_DLLS>支持、FetchContent的OVERRIDE_FIND_PACKAGE,都需要你真正调用到 3.25 的二进制文件才能生效。

我一般推荐用官方 installer 装到默认路径,然后用 winget 做版本管理。原因是 installer 会把 CMake 加入系统 PATH,而 winget 方便你后续升级或降级。Visual Studio 自带的那个 CMake 版本往往滞后,而且路径藏在 VS 安装目录深处,容易在 CI 里出玄学问题。

2.2 用 winget 安装并验证版本

# 查看 winget 源里可用的 CMake 版本 winget search cmake # 安装指定版本(3.25.x 系列) winget install Kitware.CMake --version 3.25.3 # 验证安装结果,注意看输出路径是否是你期望的那个 cmake --version where cmake

逻辑说明:winget search先确认源里有 3.25 系列,避免装成 3.24 或 3.26。--version参数锁定小版本,因为 3.25.0 和 3.25.3 在 Windows 上的 bug 修复差异不小。where cmake是关键一步——如果输出多行,说明 PATH 里有多个 CMake,后面构建时可能调用到旧版本。

参数说明:--version后面跟的版本号必须是 winget 源里存在的,可以用winget show Kitware.CMake查看所有可用版本。如果你已经装了旧版,winget 会提示冲突,需要先winget uninstall再装。

2.3 用官方 installer 的静默安装参数

# 下载 cmake-3.25.3-windows-x86_64.msi 后,用 msiexec 静默安装 msiexec /i cmake-3.25.3-windows-x86_64.msi /qn ADD_CMAKE_TO_PATH=System # 安装完成后新开一个终端,验证 cmake --version

逻辑说明:/qn表示无界面安装,适合脚本化部署。ADD_CMAKE_TO_PATH=System是 CMake installer 提供的参数,把 CMake 加到系统级 PATH 而不是用户级,这样 CI 里的服务账户也能调用到。

参数说明:如果你只想给当前用户装,把System改成User。/i后面跟 msi 文件路径,路径里有空格要加引号。静默安装不会弹 UAC,所以需要以管理员身份运行终端。

2.4 验证生成器是否可用

# 列出当前 CMake 支持的所有生成器 cmake --help # 重点看这几行是否出现 # Visual Studio 17 2022 # Ninja # MinGW Makefiles

逻辑说明:cmake --help输出的生成器列表,决定了你后面能用哪些构建后端。CMake 3.25 在 Windows 上默认支持 VS 2022 和 Ninja,但 MinGW Makefiles 需要你系统里装了 MinGW 才会显示为可用。

参数说明:如果你要用 Ninja,需要单独下载 ninja.exe 并加入 PATH。CMake 不会自动帮你装 Ninja,它只是知道怎么调用。

3. 用 CMake 3.25 写一份能跑的 Windows 构建脚本

3.1 最小可用 CMakeLists.txt 的结构

一份能在 Windows 上跑起来的 CMakeLists.txt,至少包含三部分:cmake_minimum_required、project、以及可执行目标定义。CMake 3.25 对project命令的VERSION和DESCRIPTION支持更完整,建议都写上,后面做安装包或版本宏定义时会用到。

# CMakeLists.txt cmake_minimum_required(VERSION 3.25) project(MyApp VERSION 1.0.0 DESCRIPTION "A demo app built with CMake 3.25 on Windows" LANGUAGES CXX ) # 设置 C++ 标准,CMake 3.25 推荐用 target_compile_features 而不是全局 CMAKE_CXX_STANDARD add_executable(myapp src/main.cpp src/utils.cpp ) target_compile_features(myapp PRIVATE cxx_std_17) # Windows 下设置输出目录,避免 exe 散落在构建树各处 set_target_properties(myapp PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" )

逻辑说明:cmake_minimum_required(VERSION 3.25)不只是声明最低版本,它还会启用 3.25 对应的策略(policy),影响后续命令的行为。project里写LANGUAGES CXX可以跳过 C 语言检测,加快配置速度。target_compile_features比全局设置CMAKE_CXX_STANDARD更精确,只影响 myapp 这个目标。

参数说明:RUNTIME_OUTPUT_DIRECTORY在 Windows 上控制 .exe 的输出位置,默认是构建目录的 Debug/Release 子目录。如果你用 Visual Studio 生成器,多配置环境下这个属性会被自动加上配置名后缀,可以用$<CONFIG>生成器表达式进一步控制。

3.2 用 FetchContent 拉取第三方依赖

CMake 3.25 的 FetchContent 已经足够稳定,可以在配置阶段下载依赖并直接 add_subdirectory。这比手动下载解压再 find_package 省事得多,尤其适合 Windows 上那些没有系统包管理器的库。

include(FetchContent) FetchContent_Declare( fmt GIT_REPOSITORY https://github.com/fmtlib/fmt.git GIT_TAG 10.1.1 GIT_SHALLOW TRUE ) # CMake 3.25 支持 OVERRIDE_FIND_PACKAGE,让后续 find_package(fmt) 直接命中 FetchContent_MakeAvailable(fmt) target_link_libraries(myapp PRIVATE fmt::fmt)

逻辑说明:FetchContent_Declare只是声明依赖,FetchContent_MakeAvailable才会真正下载并加入构建。GIT_SHALLOW TRUE只拉取指定 tag 的浅克隆,减少下载量。OVERRIDE_FIND_PACKAGE是 3.24 引入、3.25 完善的选项,加上后如果项目里有人写find_package(fmt),会直接命中 FetchContent 拉下来的版本,不会再去系统里找。

参数说明:GIT_TAG建议用具体版本号而不是分支名,分支名会导致每次配置都重新拉取。GIT_SHALLOW对大仓库效果明显,但如果你需要切换 tag 调试,浅克隆会报错,这时去掉这个参数即可。

3.3 用 CMakePresets.json 固化 Windows 构建配置

CMake 3.25 对 CMakePresets.json 的支持已经很完整,可以把编译器、生成器、构建类型、缓存变量全部写进预设文件,团队里每个人用同一份配置,避免「在我机器上能跑」的问题。

{ "version": 6, "configurePresets": [ { "name": "windows-msvc-debug", "generator": "Visual Studio 17 2022", "binaryDir": "${sourceDir}/build/msvc-debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", "CMAKE_CXX_COMPILER": "cl.exe" } }, { "name": "windows-ninja-release", "generator": "Ninja", "binaryDir": "${sourceDir}/build/ninja-release", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", "CMAKE_CXX_COMPILER": "cl.exe" } } ], "buildPresets": [ { "name": "build-msvc-debug", "configurePreset": "windows-msvc-debug", "configuration": "Debug" } ] }

逻辑说明:version: 6对应 CMake 3.25 支持的 presets schema。configurePresets定义配置阶段参数,buildPresets定义构建阶段参数。binaryDir用${sourceDir}变量,保证不同机器上路径一致。

参数说明:Visual Studio 生成器是多配置的,CMAKE_BUILD_TYPE在配置阶段不生效,需要在构建时用--config Debug指定。Ninja 是单配置的,CMAKE_BUILD_TYPE在配置阶段就决定了。这就是为什么我写了两个 preset,而不是一个 preset 打天下。

3.4 配置、构建、安装的三条命令

# 用 preset 配置 cmake --preset windows-msvc-debug # 构建 cmake --build --preset build-msvc-debug # 安装到指定前缀 cmake --install build/msvc-debug --prefix "D:/myapp-install" --config Debug

逻辑说明:--preset会自动读取 CMakePresets.json,不需要手动传-S和-B。--build --preset会调用对应的 buildPresets。--install需要 CMakeLists.txt 里有install()命令才会产生实际效果。

参数说明:--prefix在 Windows 上建议用正斜杠或双反斜杠,单反斜杠会被当成转义字符。--config Debug对多配置生成器必须指定,对 Ninja 可以省略。

4. Windows 上 CMake 3.25 的避坑与排查

4.1 坑一:PATH 里有多个 CMake,调用的不是 3.25

现象:cmake --version显示 3.25,但构建时报错说某个 3.25 才支持的命令不存在。

原因:PATH 里有两个 cmake.exe,终端调用的和 IDE 调用的不是同一个。Visual Studio 自带的 CMake 经常在 PATH 靠前的位置。

解决:用where cmake列出所有 cmake.exe,把非 3.25 的路径从 PATH 里移除,或者在 IDE 设置里手动指定 CMake 路径。CI 里建议用绝对路径调用 cmake。

4.2 坑二:FetchContent 下载卡住或超时

现象:配置阶段停在FetchContent_MakeAvailable不动,或者报 git clone 失败。

原因:Windows 上 git 的默认超时和代理配置与 Linux 不同,大仓库浅克隆也可能卡住。

解决:设置GIT_SHALLOW TRUE和GIT_PROGRESS TRUE,前者减少数据量,后者让你看到进度。如果公司网络有限制,可以先用git config --global http.postBuffer 524288000加大缓冲区。实在不行就手动 clone 到本地,用FetchContent_Declare的SOURCE_DIR指向本地路径。

4.3 坑三:Ninja 生成器找不到编译器

现象:cmake --preset windows-ninja-release报错说找不到 cl.exe。

原因:Ninja 不会自动加载 Visual Studio 的环境变量,需要你在「x64 Native Tools Command Prompt」里运行,或者手动调用 vcvarsall.bat。

解决:在 CMakePresets.json 里用environment字段设置编译环境,或者直接在 VS 开发者命令行里执行 cmake。我一般写一个build.bat,第一行调用 vcvars64.bat,第二行再跑 cmake。

4.4 坑四:install 后 DLL 没被复制

现象:cmake --install成功,但安装目录里只有 .exe,运行时提示缺 DLL。

原因:CMake 3.25 的install(TARGETS)默认只复制目标本身,不复制它依赖的运行时 DLL。Windows 上 MSVC 运行时和第三方库的 DLL 需要显式安装。

解决:用install(TARGETS myapp RUNTIME_DEPENDENCIES)或者手动install(FILES ...)把 DLL 复制过去。CMake 3.25 对RUNTIME_DEPENDENCIES的支持比 3.24 好,但仍有边界情况,建议先用dumpbin /dependents确认依赖列表。

4.5 坑五:CMakePresets.json 版本不匹配

现象:cmake --preset报错说 presets 版本不支持。

原因:CMake 3.25 支持的 presets schema 版本是 6,如果你写了 version 7 或 8,会直接报错。

解决:确认 CMake 版本和 presets 版本的对应关系。3.25 用 version 6,3.26 才支持 version 7。如果你从别人那里拷来的 presets 文件版本更高,要么降版本号,要么升级 CMake。

5. 让 CMake 3.25 在 Windows 上真正省心的几个进阶习惯

第一个习惯:把CMAKE_EXPORT_COMPILE_COMMANDS打开。CMake 3.25 在 Windows 上对 compile_commands.json 的支持已经很好,配合 clangd 或 VS Code 的 C++ 插件,代码跳转和补全的体验会接近 IDE。在 CMakePresets.json 的 cacheVariables 里加一行"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"即可,Ninja 生成器下会自动在构建目录生成这个文件。

第二个习惯:用cmake --build的--parallel参数控制并行度。Windows 上默认并行度可能过高导致内存爆掉,我一般设成 CPU 核心数的 70% 左右。在 buildPresets 里可以写"jobs": 8,或者命令行传--parallel 8。

第三个习惯:定期用cmake --fresh清理缓存。CMake 3.25 引入了--fresh参数,可以删除 CMakeCache.txt 和 CMakeFiles 目录后重新配置,比手动删 build 目录安全。当你改了 CMakePresets.json 里的编译器路径或生成器时,这个命令能避免很多缓存导致的玄学问题。

第四个习惯:给 install 规则加上组件划分。CMake 3.25 的install(TARGETS ... COMPONENT runtime)和COMPONENT development可以让你在打包时只取运行时或只取开发文件。Windows 上做安装包时,这个划分能省掉很多手动筛选文件的功夫。

最后一个习惯,也是我踩坑最多的地方:不要在 CMakeLists.txt 里硬编码 Windows 路径。用${CMAKE_CURRENT_SOURCE_DIR}和file(TO_CMAKE_PATH ...)处理路径,这样你的项目在 WSL 或 CI 的 Linux 容器里也能跑。CMake 3.25 对路径处理已经做了很多自动化,但反斜杠和正斜杠混用仍然是 Windows 上最常见的翻车原因之一。我现在的做法是,所有路径都用正斜杠,CMake 会在需要的时候自动转换。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询