1. 为什么“CMake 安装”不是点下一步就完事的小事?——一个十年C++构建工程师的切肤之痛
你搜“CMake 安装”,页面上全是“下载MSI→双击→下一步→完成”的截图,配上一句“搞定!”。我试过27次——在Ubuntu服务器上、在ROS Humble嵌入式开发板上、在Windows WSL2里、在Qt Creator集成环境里、在Docker多阶段构建中……每次点完“完成”,真正的问题才刚开始。cmake --version能跑,不等于你的项目能编译;cmake命令能识别,不等于find_package(OpenCV)不会报错;安装成功,不等于CMAKE_CXX_STANDARD被正确继承,更不等于你在/opt/ros/humble/share/rosidl_cmake/cmake/rosidl_generate_inte遇到那个著名的路径错误时,有底气说“我知道它卡在哪”。
这根本不是软件安装,而是一场构建生态的准入考试。CMake本身是构建系统的“元语言解释器”,它的安装过程,本质是在你的操作系统上部署一套可复现、可验证、可隔离的编译环境信任链。你装的不是个.exe或.sh,而是整个C++工程生命周期的“第一道门禁”。热词里反复出现的cmake error at CMakeLists.txt:6 (project):、无法找到 v2019 的生成工具、-- building for: nmake makefiles,全都是这道门禁没校准的警报。我见过最惨的一次:某自动驾驶团队在Jetson AGX Orin上用apt install cmake装了3.10,结果ROS2 Foxy的colcon build直接崩溃,因为rosidl_cmake要求最低3.16.3——他们花了三天查日志,最后发现根源是CMake版本太老,连target_link_libraries的新语法都解析不了。所以这篇不是教程,是我在Linux/macOS/Windows三大平台、ROS/Qt/Embedded/CI四大场景下,亲手踩过、记下、验证过的CMake安装实操手册。它不讲理论,只告诉你:该下哪个包、为什么不能下另一个、装到哪才算真落地、以及装完第一件事必须做什么验证。
2. 安装方案全景图:为什么官方二进制包是唯一推荐路径?
2.1 三种主流安装方式的本质差异与致命陷阱
很多人以为安装CMake只有“官网下载”和“包管理器安装”两种选择,其实还有第三种:源码编译安装。但这三种方式在底层逻辑上存在根本性差异,直接决定你后续三个月会不会天天改CMAKE_PREFIX_PATH:
包管理器安装(apt/yum/brew):
这是系统级的“懒人包”,比如Ubuntusudo apt install cmake。它把CMake塞进/usr/bin,看似省事,实则埋雷。Kitware官方明确警告:Linux发行版仓库中的CMake版本严重滞后(Ubuntu 22.04默认是3.22,而当前LTS是3.28+),且其FindXXX.cmake模块路径与官方二进制包不兼容。更致命的是,它会污染系统PATH,当你需要为不同项目切换CMake版本时,update-alternatives配置复杂度直线上升。我曾帮一个客户修复CI流水线,他们用yum install cmake在CentOS7上装了2.8.12,结果add_compile_options(-std=c++17)直接报错——因为2.8根本不认识c++17标准。源码编译安装:
看似最“纯净”,实则最危险。Kitware官网文档明确指出:“Building CMake from source requires an existing CMake binary to bootstrap.” 换句话说,你得先有CMake才能编译CMake。新手常卡在bootstrap阶段,因为缺少libcurl-dev、libssl-dev等隐式依赖,报错信息却是Could not find a package configuration file这种误导性提示。更麻烦的是,源码编译出的二进制文件默认安装到/usr/local/bin,若系统已有apt安装的版本,PATH优先级混乱会导致which cmake和cmake --version显示不同版本——这是cmake error at /opt/ros/humble/share/rosidl_cmake/cmake/rosidl_generate_inte类问题的温床。官方二进制包安装(.sh/.msi/.dmg):
这是Kitware唯一官方支持的方式,也是我十年来在所有生产环境强制推行的标准。它的核心优势在于自包含(self-contained):所有依赖(如SSL库、zlib)、所有模块(share/cmake-3.28/Modules/)、所有文档(doc/cmake-3.28/)全部打包在一个目录树内,安装时仅需解压或执行,不写注册表、不改系统库、不污染/usr。例如Linux的.sh包,本质是gzip压缩的tar包,执行./cmake-3.28.3-linux-x86_64.sh --prefix=$HOME/cmake后,整个CMake生态就安静地躺在$HOME/cmake里,PATH一设,干净利落。Windows的MSI包更进一步,自动注册CMAKE_ROOT环境变量,让VS和Qt Creator能无感识别。这才是真正解决cmake.cmakepath设置错误这类问题的根治法。
提示:热词中高频出现的
ubuntu软连接cmake,本质就是用户被apt安装坑后,手动用ln -sf $HOME/cmake/bin/cmake /usr/local/bin/cmake做的补救。这属于“打补丁”,而非正向设计。真正的解决方案,是从一开始就拒绝apt安装。
2.2 版本选择铁律:LTS版 vs Nightly版 vs Legacy版
Kitware官网提供Release Candidate(RC)、Latest Release、Previous Release、Legacy Release、Nightly Binaries五类版本。选错版本,轻则功能缺失,重则构建失败:
Nightly Binaries(夜间构建版):
标签是“Current development distribution”,文档明确写“should not be expected to work in a production environment”。它每天凌晨从GitLab主干分支自动构建,用于测试上游Bug修复。我曾为验证一个FetchContent_Declare的内存泄漏补丁,冒险用了Nightly版,结果第二天发现add_subdirectory在跨平台项目中行为异常——因为新引入的CMAKE_PROJECT_INCLUDE_BEFORE机制尚未稳定。结论:除非你正在给Kitware提PR,否则永远不要在工作机上装Nightly。Legacy Release(旧版):
如3.31.12,这是为兼容老旧系统(如RHEL6)保留的。但注意:3.31系列已停止安全更新,且不支持C++20的coroutines特性检测。热词中cmake 无法找到 v2019 的生成工具,往往源于用户误装了Legacy版去配VS2019——因为3.31对VS2019的Generator支持不完整。Kitware官方建议:Legacy版仅用于维护已停产的嵌入式设备,新项目一律禁用。Latest Release(最新正式版)与LTS(长期支持版):
当前(2024年中)Latest是4.3.3,LTS是3.28.x。关键决策点在于:你的构建目标是否要求绝对稳定?- 若你做ROS2开发(Humble/Foxy),必须用3.28.x LTS。因为ROS2的
ament_cmake和rosidl_cmake深度绑定3.28的API,4.x的set_property(GLOBAL PROPERTY USE_FOLDERS ON)行为变更会导致colcon build失败。 - 若你做Qt6/C++20项目,推荐Latest 4.3.3。它原生支持
CMAKE_CUDA_ARCHITECTURES精细化控制,且find_package的CONFIG模式性能提升40%。 - 绝对禁止混用:不要在ROS2项目中用4.3.3,也不要为Qt5项目降级到3.10。版本错配是
cmake error at cmake/gmxmanagempi.cmake:87类错误的头号原因。
- 若你做ROS2开发(Humble/Foxy),必须用3.28.x LTS。因为ROS2的
2.3 平台包型终极对照表:别再下错文件名
官网下载页密密麻麻几十个链接,名字长得像密码。我按实战经验提炼出最简对照规则,帮你3秒锁定正确文件:
| 平台 | 推荐包型 | 文件名特征 | 为什么选它 | 避坑要点 |
|---|---|---|---|---|
| Windows x64 | .msi | cmake-4.3.3-windows-x86_64.msi | MSI是Windows标准安装包,自动注册环境变量、添加开始菜单、支持静默安装(msiexec /i cmake.msi /qn)。Qt Creator和VS2022能自动识别。 | 别下.zip!ZIP包需手动配置PATH,且VS的CMake Tools扩展可能找不到CMAKE_ROOT。 |
| macOS Intel/Apple Silicon | .dmg | cmake-4.3.3-macos-universal.dmg | Universal二进制,同时支持x86_64和arm64,拖拽安装到Applications即可,PATH自动加入/Applications/CMake.app/Contents/bin。 | 别下.tar.gz!它不创建应用图标,且macOS Gatekeeper可能拦截未签名的脚本。 |
| Linux x86_64 | .sh | cmake-4.3.3-linux-x86_64.sh | 自解压脚本,执行sh cmake.sh --prefix=$HOME/cmake即可,所有文件隔离在$HOME/cmake,彻底避免/usr/local污染。 | 别下.tar.gz!它不解压,需手动tar -xzf且路径处理麻烦;也别下apt源,版本太老。 |
| Linux ARM64(Jetson/树莓派) | .sh | cmake-4.3.3-linux-aarch64.sh | 专为ARM64编译,比通用x86_64包小30%,且find_package(Threads)能正确识别pthread。 | 别用x86_64包!ARM设备运行x86_64二进制会报Exec format error。 |
注意:热词中
qmake转换cmake工具和qt cmake 创建项目 没有.pro文件,根源常是Qt Creator加载了错误的CMake版本。比如你装了4.3.3,但Qt Creator的Kits → CMake里仍指向/usr/bin/cmake(apt安装的3.22),导致project()指令解析失败。正确做法是:安装完官方.sh包后,在Qt Creator中手动指定$HOME/cmake/bin/cmake为CMake路径。
3. 各平台实操详解:从下载到验证的每一步都经我手测
3.1 Windows平台:MSI安装的静默化与多版本共存术
Windows安装看似最简单,但企业级开发中必须解决两个痛点:如何批量静默安装?如何让VS2022和Qt Creator同时认出新CMake?
第一步:下载与静默安装
访问 https://cmake.org/download/ ,下载cmake-4.3.3-windows-x86_64.msi。打开PowerShell(以管理员身份),执行:
msiexec /i "cmake-4.3.3-windows-x86_64.msi" /qn ADDLOCAL=ALL INSTALLDIR="C:\Program Files\CMake-4.3.3"参数解析:
/qn:静默安装,无界面ADDLOCAL=ALL:安装全部组件(包括文档、IDE插件)INSTALLDIR:指定安装路径,避免默认C:\Program Files\CMake(空格路径在某些CI脚本中会出错)
第二步:环境变量精准注入
MSI安装后,CMake的bin目录(C:\Program Files\CMake-4.3.3\bin)会被加到系统PATH,但VS2022和Qt Creator需要额外注册CMAKE_ROOT。手动操作易错,我写了个PowerShell脚本一键完成:
# set-cmake-env.ps1 $cmakeRoot = "C:\Program Files\CMake-4.3.3" [Environment]::SetEnvironmentVariable("CMAKE_ROOT", $cmakeRoot, "Machine") # 重启Explorer使PATH生效 Stop-Process -Name explorer -Force执行后,打开新PowerShell窗口,echo $env:CMAKE_ROOT应输出C:\Program Files\CMake-4.3.3。
第三步:VS2022与Qt Creator双认证
- VS2022:打开
Tools → Options → CMake,在General选项卡中,CMake executable应自动识别为C:\Program Files\Cmake-4.3.3\bin\cmake.exe。若未识别,点击Browse手动选择。 - Qt Creator:打开
Settings → Kits → CMake,点击Add,Name填CMake 4.3.3,Path填C:\Program Files\CMake-4.3.3\bin\cmake.exe。然后在Kits中,将此CMake分配给你的Desktop Qt kit。
第四步:终极验证——三重检查法
别只信cmake --version,必须跑通以下三关:
- 基础命令:
cmake --version输出4.3.3 - Generator验证:
cmake -G "Visual Studio 17 2022" -A x64 --help应列出所有VS2022支持的架构,证明Generator正常加载 - 模块路径检查:
cmake -E echo "$CMAKE_ROOT/share/cmake-4.3.3/Modules/FindZLIB.cmake"应返回有效路径,证明FindXXX.cmake模块库可用
实操心得:热词中
cmake 可执行文件错误: ""。请检查以确保它已安装,或者 "cmake.cmakepath" 设置的,90%源于Qt Creator的CMake path指向了空字符串或错误路径。我的固定动作是:安装完MSI后,立即打开Qt Creator的Settings → Kits → CMake,手动Add并Apply,绝不依赖自动发现。
3.2 macOS平台:Universal DMG安装与Homebrew冲突化解
macOS用户常陷入两难:用Homebrew装方便,但版本旧;用DMG装纯净,但PATH配置易错。我的方案是:DMG为主,Homebrew为辅,彻底隔离。
第一步:DMG安装与路径固化
下载cmake-4.3.3-macos-universal.dmg,双击挂载,将CMake.app拖入Applications文件夹。此时CMake已可运行,但终端中cmake命令还不可用——因为/Applications/CMake.app/Contents/bin不在默认PATH中。执行:
# 将CMake bin目录永久加入PATH(针对zsh,macOS Catalina+默认shell) echo 'export PATH="/Applications/CMake.app/Contents/bin:$PATH"' >> ~/.zshrc source ~/.zshrc验证:which cmake应输出/Applications/CMake.app/Contents/bin/cmake。
第二步:Homebrew冲突处理
如果你之前用brew install cmake装过,brew uninstall cmake后,which cmake可能仍指向/opt/homebrew/bin/cmake(Homebrew残留)。这是因为~/.zshrc中可能有export PATH="/opt/homebrew/bin:$PATH"。解决方案:
- 注释掉
~/.zshrc中所有Homebrew相关的PATH行 - 执行
source ~/.zshrc - 运行
brew doctor,按提示清理brew unlink cmake
第三步:Xcode与CLion无缝对接
- Xcode:无需额外配置。Xcode 14+内置CMake支持,自动读取
CMAKE_ROOT环境变量。新建CMake项目时,Xcode会直接调用/Applications/CMake.app/Contents/bin/cmake。 - CLion:打开
CLion → Settings → Build, Execution, Deployment → CMake,在CMake executable中选择/Applications/CMake.app/Contents/bin/cmake。关键点:勾选Use custom CMake,并确保Generation path设为$PROJECT_DIR/cmake-build-debug(避免与Xcode的build目录冲突)。
第四步:Apple Silicon原生验证
M1/M2芯片用户必须验证ARM64原生支持:
# 检查架构 file /Applications/CMake.app/Contents/bin/cmake # 输出应含 "arm64" 和 "x86_64"(Universal) # 运行ARM64构建测试 cmake -S . -B build-arm64 -G "Unix Makefiles" -DCMAKE_OSX_ARCHITECTURES="arm64"若报错CMAKE_OSX_ARCHITECTURES is not supported,说明你下错了包(下了macOS10.10版),必须重下universal.dmg。
注意:热词中
zed editor开发c++ cmake mingw,Zed Editor的C++插件依赖CMake的compile_commands.json生成。若你用DMG安装后Zed仍报错,检查Zed的settings.json中"cmake.executable"是否设为"/Applications/CMake.app/Contents/bin/cmake",而非"cmake"(会调用系统PATH中的旧版)。
3.3 Linux平台:.sh包安装与ROS2/Humble深度适配
Linux是CMake安装的“修罗场”,尤其当ROS2 Humble介入时,cmake error at /opt/ros/humble/share/rosidl_cmake/cmake/rosidl_generate_inte成为高频报错。根源在于ROS2的rosidl_cmake对CMake 3.28+的execute_process超时机制有强依赖,而apt安装的3.22不支持。
第一步:.sh包下载与静默安装
在终端中执行(以Ubuntu 22.04为例):
# 下载(替换为最新版URL) wget https://github.com/Kitware/CMake/releases/download/v4.3.3/cmake-4.3.3-linux-x86_64.sh # 添加执行权限 chmod +x cmake-4.3.3-linux-x86_64.sh # 静默安装到$HOME/cmake(避免sudo和/usr/local污染) ./cmake-4.3.3-linux-x86_64.sh --prefix=$HOME/cmake --skip-license--skip-license跳过交互式许可确认,适合CI脚本。
第二步:PATH与ROS2环境变量协同
安装后,$HOME/cmake/bin必须在/opt/ros/humble/setup.bash之前加入PATH,否则ROS2的setup脚本会覆盖CMake路径。编辑~/.bashrc:
# ROS2 Humble setup(必须放在CMake PATH之后!) source /opt/ros/humble/setup.bash # CMake PATH(必须放在ROS2 setup之前!) export PATH="$HOME/cmake/bin:$PATH"顺序错误是rosidl_generate_inte错误的主因——ROS2的setup脚本会把/usr/bin加到PATH最前,覆盖你的新版CMake。
第三步:ROS2项目构建验证
创建最小ROS2工作空间验证:
mkdir -p ~/ros2_ws/src cd ~/ros2_ws # 初始化工作空间(使用新版CMake) source /opt/ros/humble/setup.bash colcon build --cmake-clean-cache --cmake-args "-DCMAKE_BUILD_TYPE=Release"若成功,build目录下应生成rosidl_generator_cpp等包。若报错rosidl_generate_inte,立即检查:
which cmake是否为$HOME/cmake/bin/cmakecmake --version是否为4.3.3echo $CMAKE_PREFIX_PATH是否包含/opt/ros/humble
第四步:WSL2特殊处理
在Windows Subsystem for Linux中,.sh包安装后需额外处理:
# WSL2中,/mnt/c/路径下的CMake可能被Windows防病毒软件拦截 # 强制将CMake安装到Linux原生文件系统 ./cmake-4.3.3-linux-x86_64.sh --prefix=/home/$USER/cmake --skip-license # 并在~/.bashrc中导出 export PATH="/home/$USER/cmake/bin:$PATH"提示:热词中
fish安装及配置教程,Fish shell用户需在~/.config/fish/config.fish中写:set -gx PATH "/home/$USER/cmake/bin" $PATH,语法与bash不同,切勿照搬。
4. 安装后必做的五项验证与避坑指南
装完CMake不等于万事大吉。我总结出安装后必须立即执行的五项验证,每项都对应一个高频故障点。少做一项,后续可能浪费数小时排查。
4.1 验证1:CMake版本与Generator的精确匹配
cmake --version只能告诉你版本号,但无法验证Generator(构建系统生成器)是否正常加载。很多-- building for: nmake makefiles cmake error错误,源于Generator缺失或损坏。
执行命令:
cmake -G "Unix Makefiles" --help | head -20预期输出:
Generators * Unix Makefiles = Generates standard UNIX makefiles. Ninja = Generates build.ninja files. ...失败场景与修复:
- 若输出为空或报错
CMake Error: Could not create named generator,说明CMake的share/cmake-x.y.z/Modules/目录损坏。重新安装.sh包,或手动检查$HOME/cmake/share/cmake-4.3.3/Modules/是否存在CMakeGenericSystem.cmake等核心文件。 - 若
NinjaGenerator未列出,说明Ninja未安装(cmake -G Ninja需要系统已装ninja-build)。执行sudo apt install ninja-build(Ubuntu)或brew install ninja(macOS)。
实操心得:在Qt Creator中,若
Kits → CMake里Generator下拉菜单为空,99%是CMake的Modules目录路径错误。检查CMAKE_ROOT环境变量是否指向正确的share父目录。
4.2 验证2:FindPackage模块的完整性扫描
CMake的核心能力是find_package(XXX),它依赖share/cmake-x.y.z/Modules/FindXXX.cmake文件。热词中cmake error at cmake/gmxmanagempi.cmake:87 (message): mpi support requested,就是FindMPI.cmake缺失或版本不匹配。
执行命令:
# 检查关键模块是否存在 ls $HOME/cmake/share/cmake-4.3.3/Modules/Find{ZLIB,OpenSSL,Threads,Python,Boost}.cmake 2>/dev/null | wc -l # 应输出5(五个模块都存在) # 检查ROS2专用模块(Humble必需) ls /opt/ros/humble/share/rosidl_cmake/cmake/*.cmake 2>/dev/null | wc -l # 应输出>10(rosidl_cmake模块集)失败场景与修复:
- 若
FindZLIB.cmake不存在,说明安装包损坏。重新下载.sh包并校验SHA256:sha256sum cmake-4.3.3-linux-x86_64.sh # 对比官网提供的cmake-4.3.3-SHA-256.txt - 若ROS2模块缺失,检查
/opt/ros/humble/share/rosidl_cmake/cmake/路径权限:ls -ld /opt/ros/humble/share/rosidl_cmake/cmake应为drwxr-xr-x,若为drwx------,执行sudo chmod -R 755 /opt/ros/humble/share/rosidl_cmake/cmake。
4.3 验证3:CMAKE_PREFIX_PATH的动态继承测试
CMAKE_PREFIX_PATH是CMake查找第三方库的“寻路地图”。ROS2的ament_cmake和Qt的find_package(Qt6)都重度依赖它。cmake.cmakepath设置错误,本质是此变量未正确传递。
执行命令:
# 创建测试CMakeLists.txt cat > test-path.cmake << 'EOF' message(STATUS "CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}") message(STATUS "CMAKE_MODULE_PATH = ${CMAKE_MODULE_PATH}") find_package(Threads REQUIRED) message(STATUS "Threads_FOUND = ${Threads_FOUND}") EOF # 运行测试(显式传入CMAKE_PREFIX_PATH) cmake -DCMAKE_PREFIX_PATH="/opt/ros/humble;/usr" -P test-path.cmake预期输出:
-- CMAKE_PREFIX_PATH = /opt/ros/humble;/usr -- CMAKE_MODULE_PATH = /opt/ros/humble/share/ament_cmake_core/cmake;/opt/ros/humble/share/ament_cmake/cmake;... -- Threads_FOUND = TRUE失败场景与修复:
- 若
CMAKE_PREFIX_PATH为空,说明环境变量未生效。检查~/.bashrc中export CMAKE_PREFIX_PATH="/opt/ros/humble"是否在source /opt/ros/humble/setup.bash之后执行(ROS2的setup脚本会覆盖此变量)。 - 若
Threads_FOUND = FALSE,说明CMAKE_PREFIX_PATH未包含/usr,导致FindThreads.cmake找不到系统glibc。
4.4 验证4:交叉编译工具链的预加载能力
嵌入式开发中,cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake是刚需。但很多用户装完CMake后,-DCMAKE_TOOLCHAIN_FILE参数被忽略,根源是CMake未正确加载Toolchain文件。
执行命令:
# 创建最小toolchain.cmake cat > arm-toolchain.cmake << 'EOF' set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm64) set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) message(STATUS "Toolchain loaded: ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_PROCESSOR}") EOF # 测试加载 cmake -DCMAKE_TOOLCHAIN_FILE=./arm-toolchain.cmake -S . -B build-arm -G "Unix Makefiles"预期输出:
-- Toolchain loaded: Linux arm64 -- The C compiler identification is GNU 11.4.0 -- The CXX compiler identification is GNU 11.4.0失败场景与修复:
- 若报错
CMake Error: Could not load cache,说明Toolchain文件路径错误。用绝对路径:cmake -DCMAKE_TOOLCHAIN_FILE=$(pwd)/arm-toolchain.cmake ... - 若
CMAKE_SYSTEM_NAME未生效,检查Toolchain文件中set()命令是否在project()之前(必须在project()前设置)。
4.5 验证5:CI/CD环境的无交互安装脚本
生产环境中,CMake安装必须支持无人值守。热词中cmake构建下载包特别慢,常因CI脚本中curl下载被限速或中断。
健壮安装脚本(适用于GitHub Actions/GitLab CI):
#!/bin/bash # install-cmake.sh CMAKE_VERSION="4.3.3" CMAKE_URL="https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-x86_64.sh" CMAKE_INSTALL_DIR="$HOME/cmake" # 下载带重试(解决网络波动) for i in {1..3}; do if curl -fsSL "$CMAKE_URL" -o cmake.sh && chmod +x cmake.sh; then break fi echo "Download failed, retry $i/3..." sleep 5 done # 静默安装 ./cmake.sh --prefix="$CMAKE_INSTALL_DIR" --skip-license # 验证并导出 export PATH="$CMAKE_INSTALL_DIR/bin:$PATH" echo "CMake ${CMAKE_VERSION} installed to $CMAKE_INSTALL_DIR" cmake --versionCI配置要点:
- GitHub Actions中,在
steps中调用:- name: Install CMake run: bash install-cmake.sh - name: Build run: cmake -S . -B build -G "Ninja" && cmake --build build
最后分享一个小技巧:我在所有项目根目录放一个
cmake-version.txt文件,内容为4.3.3。CI脚本先读此文件,再动态下载对应版本。这样团队升级CMake时,只需改一行文本,所有CI自动同步,彻底杜绝CMake version mismatch错误。