简介:面向 Windows 64 位平台的 CMake 3.14.2 官方构建套件,专为需要跨平台管理项目构建的开发者准备,尤其适合配置 OpenCV 这类依赖复杂的 C++ 工程。压缩包共包含 5681 个文件,以 txt、html、rst 说明文档与 cmake 模块脚本为主,辅以 json、c/c++ 源码、exe 可执行程序等,整体约 29.58MB,目录结构完整。已有 165 人学习下载。资源内含 Windows 安装程序、cmake/cmake-gui/ccmake 命令行与图形界面工具,以及 ctest、cpack 辅助脚本;文档部分覆盖 cmake-commands、cmake-properties、cmake-variables 等主题。借助这些组件,开发者可以在 CMakeLists.txt 中定义构建逻辑,快速生成 Visual Studio 解决方案,并完成 OpenCV 的依赖配置、测试与打包,降低跨平台构建的入门门槛。 如果你最近正在Windows上折腾cmake-3.14.2-win64-x64这个安装包,那说明你十有八九是遇到了某个C++工程编译的硬门槛——要么是第三方库的构建脚本指定了CMake版本,要么是老项目文档里明确要求“必须用3.14及以上”。这玩意儿说大不大,说小不小,但装不对、配不好,后面编译时冒出来的一堆“policy”、“generator”报错,能让人一下午血压拉满。
这篇文章我就把自己在Windows 10/11 64位环境下安装、配置、实战使用CMake 3.14.2的完整过程捋一遍,覆盖从下载安装到命令行配置,再到实际编译C++工程、排查经典报错的全部内容。无论你是刚从cmake下载页面懵圈的新手,还是被“CUDA compiler not set”折磨的老手,这篇都值得花几分钟看完。
1. 为什么我最终选了3.14.2这个版本,而不是最新版
1.1 版本并不是越新越好
很多朋友一上来就去装最新的CMake,但说实话,对大多数实际工程项目来说,3.14.2是一个非常有存在感的版本。它发布于2019年,最大的意义在于稳定性和兼容性达到了一个很好的平衡点。到3.14这个阶段,CMake的核心语法、target-based设计、FetchContent模块都已经非常成熟,而后续版本虽有更新,但对普通C++编译任务来说,感知并不强。
更关键的是,很多老牌C++库和嵌入式SDK,在文档里白纸黑字写的就是cmake_minimum_required(VERSION 3.14)。你的环境如果恰好装了类似于2.8.12.2这种远古版本,编译时大概率会直接弹出一句“CMake 3.1.3...3.26 or higher is required. You are running version 2.8.12.2”然后退出。这种时候,装一个3.14.2或同级别版本,问题瞬间归零。
注意:
cmake_minimum_required不是摆设。CMake会按这个字段触发对应的兼容策略(Policy),版本太高或太低,都可能导致一些写法诡异的CMakeLists.txt编译失败。
1.2 win64-x64后缀到底代表什么
下载时你会看到安装包名字末尾带着win64-x64,这指的是“Windows 64位系统、x86_64架构”的版本。别小看这个后缀,它直接决定了你的CMake能不能配合Visual Studio的64位工具链干活。
如果你的机器是64位系统,却下载了32位的CMake安装包,后面用cmake -G "Visual Studio 16 2019" -A x64生成64位工程时,虽然多数情况下能用,但某些需要精确匹配架构的生成器或第三方库检测脚本,就会判断“架构不匹配”从而跳过或报错。所以,64位系统就老老实实下win64-x64,不折腾。
另外要提一句,如果你是在Windows 7 32位老机器上用,那就得找对应的32位包(win32-x86),这个3.14.2版本对Win7 32位支持还算完整,新版CMake有的已明确不支持Win7了,这算老版本的优势之一。
2. 下载与安装:从官网到PATH配置的完整细节
2.1 下载源的取舍
CMake的官方下载地址是cmake.org/download,打开后往下拉,找到“Binary distributions”区域。这里能看到两种格式:.msi安装版和.zip绿色版。
.msi:推荐大多数人使用,会写入注册表,配置环境变量更方便。.zip:适合不想污染系统、想多版本并存的场景,解压即用。
网络环境允许的话,直接从官方下载是最稳的。如果官网慢,可以找GitHub Releases页面的镜像(本质上也是官方维护的),或者部分高校、云厂商的软件镜像站。下载后建议核对一下文件大小,官方页面会提供校验值,有条件就验一下,防止文件损坏。
实操心得:我一般会同时保留
.zip版,因为CMake本身是纯绿色软件,zip解压后配置一下PATH就能跑。遇到某些项目要求特定版本时,直接把zip解压到D:\tools\cmake-3.14.2-win64-x64,单独给这个项目开一个终端,临时PATH指过去,完美避开版本冲突。
2.2 安装向导的3个关键选项
双击.msi进入安装向导后,有3个地方需要特别留意:
- 许可协议:这个不用看,直接Agree。
- 安装路径:默认是
C:\Program Files\CMake,我建议改成纯英文、无空格的路径,比如D:\tools\CMake。虽然新版CMake安装程序会自动处理好路径带空格的引用问题,但后面你自己写脚本时,带空格的路径总是容易多出转义符的麻烦。 - Add CMake to the system PATH:这里务必选择“Add CMake to the system PATH for all users”,或者在“Current user”和“Add to PATH”相关的选项里选一个把CMake加入环境变量。这是新手最容易踩的坑——装完了,打开cmd敲
cmake,提示“不是内部或外部命令”,瞬间以为自己没装成功。
装完之后可以在开始菜单看到“CMake”文件夹,里面是GUI界面“CMake GUI”和一个卸载入口。GUI工具后面实测用得上,比如查看缓存变量、可视化配置交叉编译参数。
2.3 忘记勾选PATH怎么办
这事我干过不止一次。如果你已经装完了才发现没加到PATH里,不用卸载重装,手动补两条环境变量即可:
此电脑→ 右键 →属性→高级系统设置→环境变量。- 在“系统变量”里找到
Path,编辑,新建两条(或者一条也行):D:\tools\CMake\bin(这是你的实际安装路径下的bin目录)
添加好后,记得打开一个新的命令行窗口,环境变量才会生效。旧窗口敲cmake还是识别不了的。
3. 环境变量与命令行验证:配好第一步
3.1 环境变量配置的两种方式,你都该会
方式一:图形界面操作,上文已经说了,简单直观。方式二:命令行。如果你需要批量在多台机器上配置,或者在脚本里完成,下面这条命令很实用:
setx PATH "%PATH%;D:\tools\CMake\bin"注意,setx会覆盖原PATH吗?不会,它会把当前PATH拼上你新加的目录,然后写回注册表。但有个坑:如果你的PATH特别长,超过Windows的字符限制,setx有可能把PATH截断。所以还是推荐图形界面操作。
配置完环境变量后,关掉当前cmd,重新打开一个新的cmd或PowerShell窗口。
3.2 cmake --version与cmake --help的预期输出
验证是否生效,最直接的就是敲:
cmake --version如果看到如下输出,说明安装成功:
cmake version 3.14.2 CMake suite maintained and supported by Kitware (kitware.com/cmake).如果提示“不是内部或外部命令”,按上面PATH配置步骤再检查一遍。
另一个非常有用的命令是cmake --help,它列出当前CMake支持的所有生成器。Windows平台上你能看到的常见生成器包括:
Visual Studio 17 2022Visual Studio 16 2019Visual Studio 15 2017MinGW MakefilesNMake MakefilesUnix Makefiles
注意:新版CMake版本越高,列出的生成器通常越多,但老版本不一定认识新的VS版本。比如3.14.2不认识“Visual Studio 17 2022”,如果你用VS2022,建议选“Visual Studio 16 2019”生成器,或者直接升CMake版本。这点在后面的实际编译中非常关键。
4. 用CMake编译一个C++工程的标准流程
4.1 一个最小CMakeLists.txt长什么样
我们先跑通一个最基础的例子。创建一个文件夹test_cmake,里面放两个文件。
main.cpp:
#include <iostream> int main() { std::cout << "Hello CMake 3.14.2!" << std::endl; return 0; }CMakeLists.txt:
cmake_minimum_required(VERSION 3.14) project(HelloCMake LANGUAGES CXX) add_executable(hello main.cpp)这里第一行指定了最低版本要求,第二行声明了工程名和语言,第三行是“用main.cpp生成一个名为hello的可执行文件”。这算是最小的CMake工程了。如果你的项目里还用了C语言,在LANGUAGES里再加上C,比如project(HelloCMake LANGUAGES C CXX)。
4.2 生成器选不对,后面全白搭
在Windows上编译C++工程,最核心的问题就是选生成器。CMake本身不编译代码,它负责生成“编译指令”,真正干活的是编译器。
假设你装了Visual Studio 2022,那么建议用:
cmake -S . -B build -G "Visual Studio 17 2022" -A x64如果你用的是VS2019,则写:
cmake -S . -B build -G "Visual Studio 16 2019" -A x64如果你用的是MinGW-w64(比如从msys2或winlibs下载的),则用:
cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_CXX_COMPILER=g++注意,MinGW Makefiles生成器要求MinGW的bin目录(包含gcc/g++/mingw32-make.exe)也已经加入了PATH,否则CMake会提示找不到编译器。我建议,能用Visual Studio就用Visual Studio,调试体验、链接器性能都好;只有当你需要快速在命令行下编译出小而快的exe时,才考虑MinGW。
4.3 构建过程:三步走,不要手抖
整个CMake流程其实就是三步:
第一步,配置:
cmake -S . -B build -G "Visual Studio 17 2022" -A x64-S .指源码目录是当前目录,-B build指构建目录是build。这一步会读CMakeLists.txt,并生成build目录下的.sln解决方案和一堆配置文件。看到“Generating done”就是成功了。
第二步,编译:
cmake --build build --config Release这一步相当于在Visual Studio里点“生成解决方案”,只是全命令行操作。--config Release指定Release配置。如果后续想换Debug,直接--config Debug再跑一次即可,无需重新配置。
第三步,运行:
.\build\Release\hello.exe或者Debug模式下:
.\build\Debug\hello.exe正常会输出Hello CMake 3.14.2!。一个完整的CMake构建闭环,到这儿就跑通了。
实操心得:如果你是用VS生成器,配置阶段建议加
-A x64,否则默认可能生成Win32平台。尤其对老项目,Win32平台会导致链接一大堆32位库时报错,排查起来很头疼。
5. 高频报错与排查手段:照着抄就能解决
5.1 版本不匹配报错
你可能会在编译别人的项目时看到类似这种:
CMake 3.1.3...3.26 or higher is required. You are running version 2.8.12.2这个错误明确告诉你:当前CMake版本(2.8.12.2)太低,不满足CMakeLists.txt里的cmake_minimum_required要求。解决方式不用多说,升级CMake到3.14.2或更高。如果升级后还报这个错,检查一下是否PATH里引用了老版本,比如某个软件自带了一套老CMake并且排在前面。可以使用where cmake查看当前使用的CMake实际路径。
5.2 CMake CUDA compiler not set
热词里有一条是“cmake error: cmake_cuda_compiler not set, after enablelanguage cmake error”,典型场景是启用了CUDA语言,但没有指定CUDA编译器:
enable_language(CUDA)或者project(... LANGUAGES CUDA CXX)。如果在没有安装CUDA Toolkit,或者CUDA路径不在默认位置的情况下,会报找不到CMAKE_CUDA_COMPILER。
解决办法:先确认安装了NVIDIA CUDA Toolkit,然后在配置时指定:
cmake -S . -B build -DCMAKE_CUDA_COMPILER="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.2/bin/nvcc.exe"也可以直接在CMakeLists.txt里加一行:
set(CMAKE_CUDA_COMPILER "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.2/bin/nvcc.exe")这一步要注意路径里的斜杠,Windows下反斜杠容易转义出错,统一用正斜杠最保险。
5.3 引入MPI时找不到mpi
热词里有“cmake 引入mpi”。最常见的编译报错有两类:一是find_package(MPI REQUIRED)找不到MPI库;二是能找到MPI但是运行时mpirun无法启动任务。
对于第一种情况,检查是否安装Microsoft MPI或MPICH。安装后,find_package(MPI REQUIRED)通常能自动定位。如果还是找不到,手动指定:
cmake -S . -B build -DMPI_CXX_COMPILER="C:/Program Files/Microsoft MPI/Bin/mpicxx.exe"对于MS-MPI来说,头文件目录和lib目录在安装后会注册到系统路径里,通常情况下find_package(MPI)能正常工作。如果不行,八成是编译器架构不对,比如用64位MS-MPI却配置了32位工程,或者反过来。重新用-A x64配置即可。
5.4 指定precompiledheaderfile:3.14版本带来的头文件预编译能力
另一个热词是“cmake 指定precompiledheaderfile”。CMake 3.14确实新增了个比较实用的功能:target_precompile_headers。以前你要手动设置VS的/YU和/Yc参数,或者靠ForceInclude这类第三方库,麻烦不说,还容易漏配。3.14开始可以在CMakeLists.txt里直接这么写:
cmake_minimum_required(VERSION 3.14) project(PCHDemo) add_executable(demo main.cpp) target_precompile_headers(demo PRIVATE <vector> <string>)这段代码的意思是:给demo这个目标预编译<vector>和<string>这两个头文件。PRIVATE表示仅该目标使用,不传导给其他依赖。配置后重新生成工程,观察编译过程,第一次全量编译时你会发现,这些头文件确实被单独打包成.pch文件了,第二次增量编译的速度提升非常明显。
但我要提醒一下:precompile header毕竟是“优化手段”,不是“必需功能”。项目很小时加它反而可能增加配置复杂度和磁盘占用,尤其是target_precompile_headers里指定的头文件如果频繁变动,预编译的优势会被大大削弱。我的建议是,对个人项目或小型工具,先别折腾PCH;等工程变大、编译时间明显吃紧时再上不迟。
5.5 Toolchain文件的作用
热词里还有“cmake toolchain”。所谓toolchain文件,就是一个集中指定编译器、链接器、目标平台架构的配置文件。最典型的场景是交叉编译,或者在Windows上使用MinGW编译ARM平台代码。使用方式也很简单:
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=path/to/toolchain.cmaketoolchain文件内部一般长这样:
set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_CXX_COMPILER arm-none-eabi-g++) set(CMAKE_FIND_ROOT_PATH /path/to/sysroot)如果你只是在本机用VS或MinGW编译本机程序,不需要写toolchain。但如果你在某天需要给嵌入式板子交叉编译时,会发现这个机制极其好用——一套CMakeLists.txt,靠不同的toolchain文件就能切换目标平台。
6. 我用了这么久,最想给你的三个建议
第一,CMake的版本管理没那么玄乎,但要养成“一个项目对应一个干净环境”的习惯。不要为了省事,把一堆版本混装在一个机器的PATH里抢位置。推荐的方式是:默认装一个稳定的最新版,再额外留几个zip绿色版在某个目录里备用,谁需要用谁,单独在脚本里指路径。
第二,报错的时候别只盯着最后一行。CMake有个特点,错误信息往往是一层套一层的,最底下的CMake Error才是根因。比如前面说的CUDA compiler问题,真正的错误可能在输出中间的CMAKE_CUDA_COMPILER not set,最后一行反而是缓存的-- Configuring incomplete, errors occurred!。把输出的前几十行翻出来看,往往能直接定位。
第三,缓存目录build不用太珍惜。很多人遇到诡异报错时,习惯各种改配置,结果CMakeCache.txt里残留一大堆旧值,怎么改都不生效。我自己的习惯是:改CMakeLists.txt之后如果出现难以理解的报错,直接删掉build目录,从头重新配置。这个过程不超过30秒,但能解决90%的“缓存污染”问题。
本文还有配套的精品资源,点击获取