简介:面向Windows 64位开发者的CMake 3.14.2官方发行版,用于在跨平台场景下统一管理构建过程,生成Visual Studio解决方案或makefile。该版本对OpenCV这类依赖较多第三方库的项目尤其友好,可在CMakeLists.txt中集中指定头文件、库路径与编译选项。压缩包约29.58MB,共5681个文件,主要包含cmake配置脚本、rst/html/txt格式的详细文档、cmake-gui与cmake等可执行程序,以及ctest、cpack等测试打包工具,另附大量示例与模块头文件,以及cmake、ctest等命令的man手册,便于离线查阅。目前已有171人学习。无论是刚接触构建系统的初学者,还是需要为OpenCV二次开发配置环境的工程师,都能借助包内文档和示例快速掌握跨平台构建方法,减少手工配置带来的时间损耗。
1. 从下载到编译:CMake 3.14.2 win64-x64 为什么是你搭建 OpenCV 环境最省事的起点
如果你准备在 Windows 64 位机器上用 OpenCV 做图像处理,第一个卡住你的不是 opencv 源码,而是 cmake3 这套构建系统——下载源码、依赖配置、生成 Visual Studio 工程,全要它来管。CMake 3.14.2 win64-x64 是 2019 年的稳定版本,放在今天仍然能正常驱动 OpenCV 3.4.x 和 4.x 的 Release 分支,而且它对 Visual Studio 2017/2019 的支持很成熟,不像新版本那样偶尔冒出编辑器兼容性报错。这篇文章适合两类人:一类是刚学 OpenCV 的新手,装完安装包发现 cmake 命令不识别,或者 GUI 一度卡在 Configure 亮红色;另一类是熟手想给团队留一个可复现的构建脚本,省得每次换机器都从零折腾。接下来我会按安装、配置、构建、排坑的顺序讲,末尾给你一个能直接抄的 bat 脚本。
2. 安装与环境配置:三个关键点让 CMake 3.14.2 在 Windows 上真正可用
2.1 选对安装包:win64-x64 与 win32-x86 的取舍
下载 CMake 3.14.2 时,发行页面会给出多个压缩包,网上很多人直接点第一个,结果装完发现根本生成不了 64 位工程。win64-x64 表示该安装包内置的是 64 位原生支持,它内部的 CMake 程序是 x64 架构,生成 Visual Studio 工程时能识别-A x64或Win64平台参数。而 win32-x86 是 32 位程序,虽然也能在 64 位系统上运行,但某些钩子脚本、Find 模块在搜索 64 位库时会走错路径,导致你后面用 OpenCV 时链接到的静态库架构对不上。
我一般会先确认系统位数,win10/win11 基本都是 x64。然后右键“此电脑”属性确认一下,再下载cmake-3.14.2-win64-x64这个包。不要图省事用 zip 便携版,安装版会自动处理注册表关联,方便后续让 IDE 识别。
2.2 安装步骤与 PATH 变量设置:避开 C 盘权限和“命令行找不到 cmake”
安装过程有三个坑,我会一个个拆开说。第一,安装路径不要选C:\Program Files\CMake这种带空格的目录。虽然 CMake 自己处理过空格,但后续你把路径写进批处理脚本时,转义会平白多出一堆反斜杠;更麻烦的是某些旧版 Find 模块拼接路径时不带引号,导致 OpenCV 的生成步骤掉链子。我每次装都会手动改成C:\Tools\CMake314,当然这是个人习惯,不强求。
第二,安装向导走到“Install Options”那一步时,务必勾选 “Add CMake to the system PATH for all users”。这一步决定了你在命令提示符里敲cmake能不能直接被找到。如果漏选了,后期还得手动去系统环境变量里加。加的时候注意只加 bin 目录,比如C:\Tools\CMake314\bin,不要整个 CMake 根目录加进去,否则系统会去根目录找cmake.exe找不到。
第三,如果遇到“没有权限写入 PATH”类似提示,多半是当前账户不是管理员或系统环境变量被策略锁住。这种时候我不会和它硬刚,直接改用用户环境变量,把 CMake 的 bin 目录加到用户 PATH 里,也能生效,只是当前用户有效。反正你开发时用哪个账号,就加哪个。加完必须新开一个控制台窗口,让环境变量重新加载,否则cmake --version依然报“不是内部或外部命令”。
2.3 命令行验证与图形界面初探
装完先不要急着开 GUI,先在新开的 CMD 里敲cmake --version,正常的输出应该包含cmake version 3.14.2。紧接着敲cmake-gui,如果窗口能弹出来,说明安装没问题。这个时候你可以顺手测一下 Visual Studio 生成器是否被识别,执行:
cmake --help输出列表里找Visual Studio 15 2017或Visual Studio 16 2019这样的字符串,只要存在,就说明 CMake 能找到对应版本的 VS 实例。如果列表为空,或者只有 MinGW Makefiles,说明你的 VS 安装位置有问题,或者 CMake 没找到注册表键值——这个在后面的避坑章节会专门讲。
3. 用 CMake 3.14.2 构建 OpenCV 项目:从源码到 Visual Studio 解决方案的完整流程
3.1 为什么选 CMake 3.14.2 而不是最新版:稳定性和生态兼容性的现实考量
很多教程会直接让你装最新版 CMake,但在 OpenCV 构建场景下,最新版不一定比老版本更可靠。CMake 3.14 是生成器表达式和 Find 模块体系相对稳定的一个节点,OpenCV 3.4.9 和 4.1.0 的官方 Release 说明里明确测试过它。我见过有人用 CMake 3.20+ 配置 OpenCV,结果在find_package(OpenCV)阶段出现Config.cmake路径变量类型变化,导致生成的工程里链接命令多出一串强制的属性,编译报 warning 当成 error。而 3.14.2 不会搞这些幺蛾子。
另外,VS 2019 的 C++ 工具集在 CMake 3.14 的兼容表里是被正式支持的,所以用 3.14.2 生成出来的.sln工程,打开后不会要求你强制转换。如果你团队里既有 VS2017 又有 VS2019,3.14.2 生成的工程两边都能打开,这是老版本的一个隐形福利。
3.2 准备 OpenCV 源码与依赖项清单
构建 OpenCV 前,先列一张依赖清单,不然 Configure 会反复报缺模块。以 OpenCV 4.x 为例,最基础的需要:
- OpenCV 主库源码(source)和解压后的 opencv_contrib 扩展模块目录,都放到同一个父文件夹下。
- Python 3.x 和 numpy,用于生成 OpenCV-Python 绑定;如果不打算用 Python 接口,可以关闭
BUILD_opencv_python3,能省很多编译时间。 - 可选的 CMake 依赖是 Eigen、TBB、OpenEXR 等,这些不装也能出包,只是某些算法模块性能会打折。
下面这个表是我常用的最小依赖集合,非必要的我都不勾,先把核心库编出来:
| 依赖项 | 是否必需 | 我一般装不装 | 备注 |
|---|---|---|---|
| Python 3.x | 否 | 装,但要指定路径 | 不装就关 python 绑定 |
| numpy | 否 | 装 | 没有 numpy 会导致 python 绑定生成不了 |
| TBB | 否 | 不装 | 开 WITH_TBB 需要单独下库 |
| Eigen | 否 | 装 | 增强姿态估计等模块性能,可选项 |
| OpenEXR | 否 | 不装 | 处理 HDR 图像才需要 |
| Qt | 否 | 不装 | 如果不开发 GUI,用默认 HighGUI 就够 |
3.3 CMake GUI 配置:从 Configure 到 Generate 一共要改动哪些参数
打开 CMake GUI,第一行填 OpenCV 源码目录,也就是包含CMakeLists.txt的那个文件夹;第二行填构建目录,我会在源码旁边新建一个build-vs2019-x64文件夹,注意构建目录永远不能在源码目录里,否则后面增量编译会触发“源目录不干净”的报错。
点 Configure,第一次会让你选生成器,这里直接选Visual Studio 16 2019,右侧平台选x64。如果机器里装的是 VS2017,就选Visual Studio 15 2017加x64。选错生成器是头号翻车点,后面我会专门写。
Configure 跑完后,重点关注这些变量:
CMAKE_BUILD_TYPE:Release 版填Release,Debug 版填Debug。这个变量会影响NOMINMAX的宏定义,如果后续在自己项目里出现min/max与 std 冲突,多半就是这里没设成多配置模式。BUILD_SHARED_LIBS:我习惯勾选,生成 DLL 方便运行时替换,也避免多个静态库导致 exe 体积爆炸。如果你要发布单文件,也可以取消勾选。BUILD_opencv_world:勾上后所有模块合并成一个 opencv_world 库,后续链接只需要opencv_world4100.lib,省事很多。OPENCV_EXTRA_MODULES_PATH:填 opencv_contrib 模块的modules目路径,不填就只编译主库里的标准模块。WITH_OPENGL和WITH_QT:没有强需求就不开,开了反而需要额外下载 OpenGL 依赖或 Qt SDK。BUILD_opencv_python3:如果你确定不要 Python 绑定,取消它,可以少编小半天。
改完这些,再点一次 Configure,红色变量全部变白后点 Generate,最后点 Open 直接打开 VS 工程。如果你不想点鼠标,见下一小节。
3.4 命令行生成方式:用一行命令交出一致的构建配置
GUI 适合新手,但换机器时还是要重新点一遍,很烦。推荐在拿到源码后直接用命令行生成,把配置固化到 bat 脚本里。以 VS2019 x64 为例,我的生成命令是这样:
cmake -S D:\opencv\opencv-4.1.0 -B D:\opencv\build-vs2019-x64 -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DBUILD_opencv_world=ON -DOPENCV_EXTRA_MODULES_PATH=D:\opencv\opencv_contrib-4.1.0\modules -DBUILD_opencv_python3=ON-S指定源码根目录,-B指定构建目录,如果目录不存在 CMake 会自动创建。-G后面必须跟生成器名称,要用"Visual Studio 16 2019"这种带引号的完整名,不能只写"Visual Studio"。-A指定平台架构,x64是必须的,否则默认生成 Win32 工程,后面 OpenCV 的 x64 库一个都链接不上。
-D是缓存变量开关,优先级比 GUI 里改的高。注意BUILD_opencv_python3要不要开,取决于你有没有对应 Python 的 Debug 版本库。如果你机器的 Python 是官网安装的,那没问题;如果是 Windows Store 里面的精简版,CMake 经常找不到python3_d.lib,这种情况下我劝你直接关掉这个选项,避免 Configure 卡很久。
生成完成后,构建目录里会出现OpenCV.sln,后面你既可以用 VS 打开编译,也可以用命令行继续构建:
cmake --build D:\opencv\build-vs2019-x64 --config Release --target ALL_BUILD -j 8--build后面的路径就是构建目录,--config Release告诉 MSBuild 编译 Release 配置,-j 8限制并行编译任务数,防止内存不够导致 OOM。这条命令跑完,OpenCV 的 install 目录里就会产出opencv_world4100.dll和对应的.lib文件,接下来就能拿这些去自己项目里做find_package了。
4. 避坑排查:Windows 下 CMake 加 OpenCV 的 5 个经典坑,每个都能让你白忙一晚上
4.1 Configure 报错:The source directory is not empty 或源码被污染
现象:CMake 第一次 Configure 就红字,提示The source directory "D:/opencv/opencv" does not appear to contain CMakeLists.txt.或者The source directory is not empty。
原因:多数是把源码跟构建目录混在一起,或者解压源码时把上一版的构建缓存CMakeCache.txt也带进去了;还有的是因为手动编译失败后残留了CMakeFiles文件夹。
解决:构建目录永远新建一个干净文件夹。另外源码目录里不要出现CMakeCache.txt,如果有,直接删除。我会在解压 OpenCV 源码后先搜一遍CMakeCache*,确保目录干净,再开始配置。
4.2 找不到 Python 或 OpenCV-Python 模块直接消失
现象:Configure 时 CMake 提示Could NOT find PythonInterp: Found unsuitable version "2.7"...,或者生成后lib\python3目录里没有cv2.pyd。
原因:Windows 上装了多个 Python 版本,CMake 默认搜索注册表,命中 Anaconda 的 base 环境或 Python 2.7 残留,导致解释器和开发库版本不一致。新版 CMake 用了Python3模块,但 3.14.2 还在用PythonInterp和PythonLibs,两个变量互相独立,经常一个找到 3.7、另一个找到 3.8。
解决:在 GUI 里手动搜索PYTHON_EXECUTABLE、PYTHON_INCLUDE_DIR、PYTHON_LIBRARY三个变量,把它们指到同一个 Python 安装路径。命令行里可以直接追加:
-DPYTHON_EXECUTABLE=C:/Python37/python.exe -DPYTHON_INCLUDE_DIR=C:/Python37/include -DPYTHON_LIBRARY=C:/Python37/libs/python37.lib注意用正斜杠,避免反斜杠转义问题。如果还是不生成cv2.pyd,干脆关掉BUILD_opencv_python3,先保证 C++ 库能编出来,后面再用 pip 安装官方 OpenCV 包也行。
4.3 选的生成器和实际安装的 Visual Studio 对不上
现象:Configure 一直显示Generator: Visual Studio 16 2019,但点击 Open 时 VS 报错说找不到工具集,或者编译时提示MSB8020: The build tools for v142 cannot be found.
原因:CMake 的注册表探测只认 VS 的最新版本,但机器上装的是 VS2017,或者装了 VS2019 但 C++ 桌面开发组件没勾选。还有一种情况是你选了 VS2019,但工程文件被旧版 VS 打开,导致平台工具集被降级。
解决:打开“Visual Studio Installer”,看“使用 C++ 的桌面开发”组件是否安装。然后确保 CMake 生成器和 VS 主版本严格一致:VS2017 对应Visual Studio 15 2017,VS2019 对应Visual Studio 16 2019。如果只有 VS2019,但 CMake 列表里没有它,重启一次 VS 安装器再检查。我一般重启电脑后重新打开 CMake GUI,注册表读不到的问题多半就消失了。
4.4 编译时内存爆掉或 fatal error C1083
现象:cmake --build跑一半,MSBuild 报fatal error C1083: Cannot open compiler intermediate file,或者直接报C1060: compiler is out of heap space。
原因:Windows 上 MSBuild 默认会启动尽可能多的编译进程,如果你内存只有 8G,OpenCV 几千个文件的会同时开 20 个 cl.exe,每个吃掉 500MB,很快内存见底。
解决:构建时强制限制并行数,用/maxcpucount或-j。比如:
cmake --build D:\opencv\build --config Release -j 4我在 16G 内存的机器上一般限到 6,32G 内存才敢开到 12。另外可以临时增加虚拟内存到 16G 以上,但治标不治本。如果编译到一半崩了,不要重新整编,直接再跑一次同样的命令,MSBuild 会增量编译,只补剩余文件。
4.5 运行时提示找不到 opencv_world4100.dll
现象:编译成功生成了 exe,但运行程序时弹窗The code execution cannot proceed because opencv_world4100.dll was not found.
原因:OpenCV 的动态库目录没有加到系统 PATH,exe 运行时搜索 DLL 的路径列表里没有它。VS 调试时会自动复制依赖 DLL,但如果你直接双击 exe 或在 CMD 里跑就会缺。
解决:把构建目录下install\x64\vc16\bin加入 PATH,或者把opencv_world4100.dll复制到 exe 同级目录。我建议用 set PATH 的方式,在启动脚本里临时加:
set PATH=D:\opencv\build-vs2019-x64\install\x64\vc16\bin;%PATH%不要修改全局系统 PATH,免得多个 OpenCV 版本互相打架。如果你用的静态库(BUILD_SHARED_LIBS=OFF),则不需要这一步。
5. 进阶:写一个可复用的 build_opencv.bat,下次直接一键构建
用 GUI 点配置的第一次会花 20 分钟,但第二次我绝不再手点。我会把整个构建过程固化成一个 bat 脚本,里面放一个“配置变量区”,每次改几行就能适配新环境。下面是一个我常用的最小脚本:
@echo off set SRC=D:\opencv\opencv-4.1.0 set CONTRIB=D:\opencv\opencv_contrib-4.1.0\modules set BUILD=D:\opencv\build-vs2019-x64 set GENERATOR=Visual Studio 16 2019 set ARCH=x64 set PYTHON_EXE=D:\Python37\python.exe set PYTHON_INCLUDE=D:\Python37\include set PYTHON_LIB=D:\Python37\libs\python37.lib cmake -S %SRC% -B %BUILD% -G "%GENERATOR%" -A %ARCH% ^ -DCMAKE_BUILD_TYPE=Release ^ -DBUILD_SHARED_LIBS=ON ^ -DBUILD_opencv_world=ON ^ -DOPENCV_EXTRA_MODULES_PATH=%CONTRIB% ^ -DPYTHON_EXECUTABLE=%PYTHON_EXE% ^ -DPYTHON_INCLUDE_DIR=%PYTHON_INCLUDE% ^ -DPYTHON_LIBRARY=%PYTHON_LIB% ^ -DBUILD_opencv_python3=ON cmake --build %BUILD% --config Release -j 8这个脚本的关键点是^续行符,它告诉 CMD 下一条命令还是同一行。注意-G后面带空格的生成器名称一定要用双引号包住,而%GENERATOR%变量本身已经包含空格,所以脚本里我用了"%GENERATOR%",相当于 CMake 接收到的参数是-G "Visual Studio 16 2019"。如果你用的变量路径里有空格,比如C:\Program Files\...,则每次-D后面也要用引号包住变量值,否则 CMake 会把它拆成多个参数。
如果你不需要 Python 绑定,把PYTHON_*三行删掉,同时把-DBUILD_opencv_python3=ON改成OFF或直接删除。这样 Config 阶段会少很多探测步骤,失败概率下降一大截。编译时也可以只编需要的模块,比如只编 core、imgproc、highgui,用-DBUILD_LIST=core,imgproc,highgui,能省一半时间,但前提是你的代码不依赖其他模块。
拿到open_world库和头文件后,你自己的项目里只需要三行 CMake 就能用上:
find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) target_link_libraries(my_project PRIVATE ${OpenCV_LIBS})这里有个易踩的细节:find_package(OpenCV)必须开启CMAKE_PREFIX_PATH,否则 CMake 找不到安装目录。在你自己项目的 CMakeLists.txt 开头加:
set(CMAKE_PREFIX_PATH D:/opencv/build-vs2019-x64/install)要注意 install 目录是从哪来的。你手动编译 OpenCV 时如果不执行cmake --install,则 install 目录不会生成,最终find_package时OpenCV_DIR只能指向构建目录里OpenCVConfig.cmake所在的位置。因此我建议构建完成后单独跑一次安装:
cmake --install D:\opencv\build-vs2019-x64 --config Release --prefix D:\opencv\install--prefix可以自定义安装根目录,后面你就可以把install整个拷给同事或别的机器,不用再重新编译。我习惯把 install 目录整理成一个干净的 SDK 目录,只保留 include、lib、bin,这样即使构建目录没了,我依然能链接。
从那以后,我每次搭 OpenCV 环境都强制走一遍这个脚本:先改set SRC和set BUILD,然后跑一次,配置变量全部由脚本固定,不会手滑漏掉-A x64或搞错 Python 路径。有一次我在新机器上直接双击脚本,结果 Configure 还是报错,原因是脚本里的PYTHON_LIB路径是老的 3.6,新机器装的是 3.8,我花了两分钟改成机器上的实际路径,之后二十分钟就编译完了——比从 GUI 点起快了一个钟头。这份踏实感,就是值得为 CMake 3.14.2 多花几分钟的理由,希望帮到你。
本文还有配套的精品资源,点击获取