
简介基于跨平台应用框架Qt6.2.2与开源计算机视觉库OpenCV4.5.5采用MinGW编译工具链构建的OpenCV预编译库资源包面向需要在Qt项目中集成OpenCV的Windows开发者尤其适合使用MinGW环境、希望省去复杂编译配置的初学者与项目团队。资源包含可直接链接的静态库、动态库及完整头文件覆盖图像处理、特征检测、深度学习推理等常用模块可用于快速搭建人脸识别、物体检测、图像分割等视觉应用。整个压缩包约308.46MB共包含12280个文件文件类型涵盖源代码文件cpp、hpp、h、编译产物obj、a、dll、构建脚本cmake、make以及测试图片png、jpg等便于开发时查阅和调试。包内已集成OpenCV核心模块及dnn、aruco等扩展模块使用者在Qt Creator中只需配置.pro文件的包含目录与库依赖即可直接调用无需再自行执行CMake配置和make编译。已有1102人学习下载适合希望快速搭建Qt与OpenCV开发环境、专注于视觉功能实现的开发者。 这段时间我把 Qt 6.2.2 和 OpenCV 4.5.5 的环境重新搭了一遍和之前用 MSVC 编译套件不同这次全程改用 MinGW 工具链自己编译 OpenCV 库。折腾过程中踩了不少坑也把整个链路重新梳理清楚了这篇文章就完整记录一下我是怎么从零把这套环境跑通的给同样在用 Qt 做图像处理、又不想被官方预编译包绑定的人做个参考。先说结论Qt 官方下载页提供的 OpenCV 预编译库是 MSVC 2019 版本和 Qt 6.2.2 自带的 MinGW 11.2.0 工具链在 ABI 层面不兼容直接拿来链接会报一堆 undefined reference。所以如果你确定用 MinGW 开发唯一靠谱的路线就是自己编译一份 OpenCV 库。这篇文章的核心就是解决这个事从 CMake 配置、MinGW 编译参数到最终在 Qt 工程里链接、发布完整走一遍。1. 为什么非要自己编译 OpenCV1.1 MSVC 和 MinGW 的 ABI 差异到底在哪很多初学者最容易忽略的问题就是编译器的“血统”必须一致。MSVC 是微软自家的 C 编译器MinGW 是 GCC 在 Windows 平台上的移植版本两者虽然都能生成 x86/64 的机器码但底层的二进制接口规则完全不同。我这里不绕弯子直接说最核心的几个差异点C 符号修饰规则不同同一个函数MSVC 编译出来的符号名和 MinGW 编译出来的符号名完全不一样链接器在解析时找不到对应符号就会爆 undefined reference。标准库实现不同MSVC 绑定的是微软的 STLMinGW 绑定的是 libstdc两种标准库的类内存布局、异常处理机制都有差异混着用轻则运行崩溃重则直接编译失败。导入库格式不同Windows 下链接动态库需要的是 .libMSVC 用或 .dll.aMinGW 用官方预编译包只提供了 .libMinGW 的链接器根本认不了。用一个生活化的类比就是都是拧螺丝但一个用十字螺丝刀、一个用六角扳手工具规格不匹配硬拧的结果就是滑丝。所以 Qt 里如果用 MSVC 套件开发官方 OpenCV 包没问题一旦切到 MinGW 套件就必须自己编译。1.2 Qt 6.2.2 OpenCV 4.5.5 MinGW 这套组合选型的理由版本选型其实不是随便拍脑袋定的。我在选型时主要考虑三点Qt 6.2.2这是 Qt 6 系列第一个 LTS 版本工具链集成最完整官方在线安装器里直接带 MinGW 11.2.0 64-bit 套件不需要额外去装编译器开箱即用。OpenCV 4.5.54.5.x 系列整体处于功能稳定期CMake 配置不再像 3.x 那样需要手工处理一堆依赖尤其是WITH_QT选项在 4.5 版本上和 Qt6 的兼容性已经做得比较成熟。再往上 4.6、4.7 我也试过编译能过但 Qt 模块的高gui显示反而容易出现 QOpenGLWidget 相关的兼容问题所以最终锁定了 4.5.5。MinGW 11.2.0随 Qt 6.2.2 官方分发的版本GCC 版本足够新支持 C17OpenCV 4.5.5 的所有模块都能正常编译不用自己折腾环境变量。1.3 编译前要准备的完整工具清单在正式开始之前先把工具链备齐。我列一下我当时准备的清单工具版本用途Qt 6.2.2含 MinGW 11.2.0 64-bit 组件提供 Qt 库和编译器OpenCV 源码4.5.5编译目标必须下载源码包不能用预编译包CMake3.22 及以上生成 Makefile 和构建配置Python3.x可选如果不需要 Python 接口可以忽略7-Zip最新版解压源码包Windows 自带解压对超大 zip 容易出错OpenCV 源码从官网下载就行注意选Sources版本文件名类似opencv-4.5.5.zip。下载后建议放在一个纯英文路径下比如D:\opencv\src不要放在带中文或空格的路径里否则后面 CMake 配置阶段会出现各种奇怪问题。2. CMake 配置阶段的几个关键细节2.1 目录结构规划这个看似不起眼实际影响挺大。我习惯这样规划目录D:\opencv ├── src # OpenCV 源码解压目录 └── build-mingw # CMake 构建目录独立于源码目录构建目录和源码目录分开是基本操作这样源码目录不会被 CMake 生成的缓存文件污染后面想换个编译器重新编译只需新建一个 build 目录互不影响。我见过有人直接在源码目录里点 Configure结果出了问题想重新来源码目录里散落了一堆 CMakeCache清理起来非常痛苦。2.2 用 CMake 指定编译器的正确姿势打开 CMake GUI 后填好源码目录和构建目录第一次点击 Configure 时CMake 会弹出选择生成器的对话框。这里有一个关键操作生成器必须选择“MinGW Makefiles”而不是默认的 Visual Studio 系列或 NMake Makefiles。选完生成器后CMake 还会要求指定 C 和 C 编译器。这里要手动指向 Qt 安装目录下的工路注意路径不能写错。我当时如果记得没错路径类似这样C:/Qt/6.2.2/mingw_64/bin/gcc.exe C:/Qt/6.2.2/mingw_64/bin/g.exe这里我重点提醒一下很多人卡在 Configure 报错找不到编译器就是因为直接用了系统默认的 cl.exeMSVC或者干脆没装编译器。CMake 默认会尝试检测系统编译器但 Qt 的 MinGW 不在系统 PATH 里所以必须手动指定这一步省不了。2.3 关键 CMake 参数解析和建议值Configure 阶段会生成一堆缓存参数我这里只挑影响最大的几个说。参数设置不好轻则编译时间翻倍重则整个构建失败甚至运行时崩溃。参数名建议值说明CMAKE_BUILD_TYPERelease不设置的话默认是空会导致一些优化参数没生效编译出的库性能差一截CMAKE_PREFIX_PATHC:/Qt/6.2.2/6.2.2/mingw_64让 CMake 能自动找到 Qt 6 的安装路径这样编译 OpenCV 的 Qt 模块时才能正确链接WITH_QTON启用 Qt 后端cv::imshow 显示窗口会走 Qt 渲染WITH_OPENGLONQt 后端依赖 OpenGL建议开启WITH_IPPOFFIntel 的加速库不开能大幅减少编译时间对普通场景性能影响不大WITH_CUDAOFF没有 NVIDIA GPU 需求就关掉省一大半编译时间BUILD_EXAMPLESOFF官方示例代码量很大编译它们纯粹浪费时间BUILD_TESTSOFF测试模块同理关掉BUILD_opencv_python3OFF用不到 Python 绑定就关掉否则还会额外要求 numpy这些参数里最容易被忽略的是CMAKE_PREFIX_PATH。如果不设置这个CMake 在检测 Qt 6 时大概率会失败然后 WITH_QT 就自动变回 OFF编译出来的 OpenCV 库虽然能处理图像但完全没有图形显示能力跑 cv::imshow 直接崩。我第一次编译时就犯了这个问题后面排查了很久才意识到是 CMake 没找到 Qt 库目录。参数确认无误后点击 Generate 生成 Makefile。这一步如果报错仔细看日志通常都是上面几个路径问题解决掉再重新 Configure 即可。3. 正式编译的完整过程和避坑记录3.1 编译前必须使用的终端环境Generate 完成后很多人的第一反应是打开 CMD 直接敲 make。这里又有一个大坑千万不要用系统自带的 CMD 或 PowerShell 编译。因为 MinGW 的编译器、链接器等工具链程序不在系统 PATH 里你直接敲 mingw32-make 会提示找不到命令。正确做法是从 Windows 开始菜单打开 Qt 自带的终端快捷方式名字一般是Qt 6.2.2 (MinGW 11.2.0 64-bit)。这个终端会自动配置好 PATH、QTDIR 等环境变量你再执行编译命令就不会有问题。我一般这样操作cd /d D:\opencv\build-mingw mingw32-make -j8-j8是最重要的参数意思是同时用 8 个编译线程能显著缩短编译时间。这个数字建议不要超过 CPU 物理核数的两倍我本机是 8 核 16 线程用-j8比较平衡如果内存只有 8G建议降到-j4防止编译过程中内存爆炸。整个 OpenCV 4.5.5 编译下来我实测大约 35 到 50 分钟具体看机器配置。3.2 编译完成后如何找到库文件编译成功后OpenCV 生成的库文件默认分散在两个目录D:\opencv\build-mingw\bin存放所有 DLL 动态库D:\opencv\build-mingw\lib存放链接用的导入库格式为libopencv_core455.dll.a这里有个很容易搞混的概念。MinGW 下链接 OpenCV 时LIBS里写的是lib目录下的.dll.a文件而不是bin目录下的.dll。.dll.a是导入库告诉链接器“这个符号在这个 DLL 里”相当于 MSVC 下的.lib文件。如果你在LIBS里直接写 DLL 的路径编译时会报错或根本无法解析符号。3.3 验证编译结果是否可用编译完成后建议先做一个最小验证确认库有没有问题。我习惯写一个最简单的 C 文件#include opencv2/opencv.hpp #include iostream int main() { std::cout OpenCV version: CV_VERSION std::endl; cv::Mat mat(100, 100, CV_8UC3, cv::Scalar(0, 255, 0)); cv::imwrite(test.png, mat); std::cout Test image saved. std::endl; return 0; }在 Qt 终端里编译g -o test test.cpp -I D:/opencv/build-mingw/include -L D:/opencv/build-mingw/lib -lopencv_core455 -lopencv_imgcodecs455能输出版本号并生成 test.png就说明这套库可以用。这一步一定要做不要直接闷头往大项目里集成到时候链接报错根本分不清是库的问题还是自己工程配置的问题。4. 在 Qt 6.2.2 工程中集成编译好的 OpenCV4.1 .pro 文件的配置写法库编译好了接下来就是接入 Qt 工程。我这里拿一个普通的 QWidget 工程举例.pro文件的关键配置如下QT core gui widgets TARGET OpenCVTest TEMPLATE app INCLUDEPATH D:/opencv/build-mingw/include LIBS -LD:/opencv/build-mingw/lib \ -lopencv_core455 \ -lopencv_imgproc455 \ -lopencv_highgui455 \ -lopencv_imgcodecs455注意几点INCLUDEPATH指向的是 include 目录里面包含了opencv2头文件目录。LIBS里-L指定库搜索路径-l指定链接哪个库库名要去掉lib前缀和.dll.a后缀。-lopencv_highgui455是必须的如果只处理图像不显示窗口可以不要但大部分场景都要。4.2 代码层面的几个实际坑点集成阶段最容易出问题的不只是链接配置还有代码编写习惯。我直接给一段可用的示例#include QApplication #include QFileDialog #include QLabel #include opencv2/opencv.hpp int main(int argc, char *argv[]) { QApplication a(argc, argv); // 弹出文件选择对话框获取图片路径 QString filePath QFileDialog::getOpenFileName( nullptr, 选择图片, ., Images (*.png *.jpg *.bmp)); if (filePath.isEmpty()) { return 0; } // OpenCV 读取和处理 cv::Mat image cv::imread(filePath.toStdString()); if (image.empty()) { return 0; } cv::Mat gray; cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY); // 转换为 QImage 显示在 QLabel 上 cv::Mat rgb; cv::cvtColor(gray, rgb, cv::COLOR_GRAY2RGB); QImage qimg(rgb.data, rgb.cols, rgb.rows, static_castint(rgb.step), QImage::Format_RGB888); QLabel label; label.setPixmap(QPixmap::fromImage(qimg.copy())); label.show(); return a.exec(); }这里我想重点说两个坑第一个坑OpenCV 的 imread 在 Windows 下不支持中文路径。如果你的图片路径里带中文比如D:\图片\test.jpgimread会直接返回空 Mat而且不会报任何错误。这个问题网上讨论很多4.5.5 版本依然存在。规避方案是用QFileDialog拿到路径后先用QFile把文件读成二进制再通过cv::imdecode解码绕开imread的文件名解析逻辑。QFile file(filePath); if (!file.open(QIODevice::ReadOnly)) return 0; QByteArray data file.readAll(); std::vectoruchar buf(data.begin(), data.end()); cv::Mat image cv::imdecode(buf, cv::IMREAD_COLOR);第二个坑QImage 和 cv::Mat 数据格式转换。Qt 的QImage::Format_RGB888是 RGB 顺序而 OpenCV 默认 BGR 顺序直接转换色彩会错乱。必须先cv::cvtColor做一下通道转换否则图像显示后红蓝通道是反的。这个几乎每个人都会踩一次。4.3 发布时 DLL 的处理方式Qt 工程编译通过后要发布给别人用需要把必需的 DLL 都放到 exe 同目录。Qt 自带的依赖可以交给工具处理在 Qt 终端里执行windeployqt OpenCVTest.exe这个命令会自动把 Qt 相关的 DLL 复制到 exe 目录。然后还需要手动把 OpenCV 的 DLL 也拷过去cp D:/opencv/build-mingw/bin/opencv_core455.dll . cp D:/opencv/build-mingw/bin/opencv_imgproc455.dll . cp D:/opencv/build-mingw/bin/opencv_highgui455.dll . cp D:/opencv/build-mingw/bin/opencv_imgcodecs455.dll .更省事的做法是直接把D:/opencv/build-mingw/bin加入系统 PATH 环境变量这样运行时会自动搜索到但考虑到分发时目标机器不一定有这个目录最稳妥的还是把 DLL 放在 exe 同级目录。5. 常见问题与排查技巧实录5.1 问题速查表这里把我编译、集成、运行过程中遇到过的典型问题整理成了一张表方便大家对照排查症状原因解决方案CMake Configure 报错找不到编译器没有手动指定 MinGW 的 gcc/g重新 Configure指定 C/C 编译器路径编译时提示找不到 Qt6 相关模块CMAKE_PREFIX_PATH 没设置或路径错误在 CMake 里设置 CMAKE_PREFIX_PATH 指向 Qt 安装目录链接阶段大量 undefined reference编译器不一致MSVC 的库用来链接 MinGW 工程换用自己编译的 MinGW 版 OpenCV 库运行时报找不到 DLL系统 PATH 没包含 OpenCV 的 bin 目录把 bin 目录加入 PATH或拷贝 DLL 到 exe 目录cv::imread 返回空 Mat图片路径带中文或文件不存在用 QFile 读取后 imdecode避免中文路径图像显示颜色偏蓝偏红QImage 和 cv::Mat 的 RGB/BGR 通道顺序不一致先 cv::cvtColor 转换到 RGB 再转 QImage编译过程耗时过长开了 WITH_IPP、WITH_CUDA、BUILD_EXAMPLES 等关掉非必要模块只保留核心功能5.2 一个非常隐蔽的坑TMP 目录和编译失败还有一个问题不太容易想到就是编译过程中如果系统临时目录空间不足mingw32-make会在某个模块编译到一半时突然报错错误信息通常指向一个临时文件无法创建。我自己的 C 盘剩余空间当时不太够编译 OpenCV 的 dnn 模块时经常挂掉后来把环境变量TMP和TEMP指向了空间宽裕的 D 盘重新编译就顺利通过了。如果你在编译中途频繁失败可以优先检查临时目录空间和位置。5.3 关于 Debug 和 Release 库混用OpenCV 编译时如果只选了 Release生成的库就只有一份。Qt 工程里如果同时存在 Debug 和 Release 两个构建版本建议都链接同一个 Release 库不要在 Debug 工程里链 Release 库的同时又在 Release 工程里链 Debug 库很容易出现运行时行为不一致的问题。我一般只编译 Release 库Qt 工程也统一用 Release 构建省事且性能好。Debug 库的链接调试需求不是没有但正常业务开发用不上不用强行追求两套库。最后分享一点个人体会整套流程走下来我最深的感受是编译 OpenCV 本身就是个体力活真正的门槛并不在于 Make 命令敲得对不对而在于对整个工具链的“血统”有没有清楚的认识。MSVC 的库给 MinGW 用会挂MinGW 编译时找不到 Qt 路径会挂DLL 没放到运行目录也会挂这些坑背后其实是同一个逻辑——把编译器家族、头文件、导入库、运行时 DLL 这四者的路径和类型完全对齐整套环境就稳了。经验上我强烈建议第一次编译时不要贪多把 CUDA、Python、IPP 这些用不到的特性全关掉先把最基础的核心模块编译出来跑通最小示例后再按需补加模块。另外CMake 配置确认无误后可以把关键配置保存成一个脚本文件下次要重装环境时直接批量执行省得重新在 GUI 里点一遍。如果你正准备在 Qt 6.2.2 下用 MinGW 编译 OpenCV 4.5.5照着这篇文章的顺序走一遍基本不会出大问题。中间如果卡住了先对照排查表找原因大概率是某个路径没对上或者某个参数开错了。祝编译顺利。本文还有配套的精品资源点击获取