
简介这是一份由Qt6.2.2与OpenCV4.5.5在MinGW环境下编译生成的OpenCV库文件包面向Windows下使用Qt Creator进行图像处理、计算机视觉开发的工程师与研究者。包内集成了已编译库文件和配套依赖可在Qt项目中直接链接调用省去自行配置CMake与编译源码的过程也降低了MinGW下依赖和链接器设置难度。资源包共12280个文件、约308.46MB以cpp/obj/d/hpp/h等源码、头文件和cmake配置脚本为主并含大量png/jpg示例图片及python工具脚本便于查看实现和测试用例。已有1102人学习/下载适合需要快速搭建QtOpenCV环境的开发者可借助构建产物理解OpenCV模块组织方式减少编译配置中的常见排错成本。1. 为什么要自己编译官方预编译库与Qt6的兼容性问题如果你正在用Qt 6.2.2做Windows桌面开发大概率会遇到这个问题打开OpenCV官网下载了最新的Windows版本一编译报一堆错或者明明编译过了运行时一闪就没了调试器里全是“未找到opencv_world450.dll”这类提示。更常见的是链接阶段直接报一堆无法解析的外部符号比如找不到cv::Mat的构造函数。老实说很多刚开始碰QtOpenCV的人都会卡在这一步因为在Windows上事情和Linux下完全不一样。Linux下用系统的g配合OpenCV基本就是apt install libopencv-dev然后g main.cpp \pkg-config --cflags --libs opencv4就完事了但Windows下的OpenCV官方预编译包默认是用MSVC编译的。这意味着你如果用MinGW工具链也就是Qt 6.2.2自带的那个编译器去链接MSVC编译出来的库文件结果通常是“链接失败”或者“二进制不兼容”。这里面最核心的问题在于两个编译器生成的COFF目标文件格式、运行时库和符号修饰规则不一样所以没有第三个选择只能重新编译一份MinGW版本的OpenCV。这篇我详细记录一下我在Windows 10环境下用Qt 6.2.2内置的MinGW 11.2.0工具链从源码编译OpenCV 4.5.5的完整过程其中包括CMake配置阶段的关键参数、编译阶段的踩坑备忘以及编译完之后如何在Qt工程里正确使用这套库。整个过程踩了不少坑有些坑真的能把人搞到崩溃我把关键点都整理出来了。2. 环境准备与版本匹配最容易翻车的环节2.1 完整环境清单先说我的环境这一步的重要性怎么强调都不过分。很多人在编译失败之后反复折腾CMake参数但根本问题是版本之间串了或者工具链路径错了。我这边的最终可用版本组合如下操作系统Windows 10 专业版 64位Qt版本6.2.2在线安装包安装安装时勾选了MinGW 11.2.0工具链组件编译器GCC 11.2.0MinGW-w64 / x86_64CMake版本3.22.3OpenCV版本4.5.5源码包构建工具MinGW自带的mingw32-make注意这里有一个非常容易踩的坑——Qt安装时自带的MinGW版本是11.2.0具体看你装的组件而很多人电脑上可能以前装过Code::Blocks或者Dev-Cpp里面带着一个很老的MinGW 8.1.0。如果PATH环境变量里同时存在这两个版本CMake在探测编译器时可能随机选到老版本导致编译失败。建议把Qt安装目录下的MinGW路径类似D:\Qt\Tools\mingw1120_64\bin提到PATH的最前面。2.2 源码与目录规划一个容易被忽略的坑OpenCV源码下载的时候我建议大家去GitHub的tags页面下载不要用GitHub的自动打包ZIP也不要下载那些看起来奇怪的分支版本。我用的地址是https://github.com/opencv/opencv/releases/tag/4.5.5下载Source codezip或tar.gz都行解压之后我的目录结构是这样组织的D:\opencv\ ├─ sources\ │ ├─ modules\ │ ├─ CMakeLists.txt │ └─ ... ├─ build-qt\ │ ├─ CMakeCache.txt │ └─ ... └─ install\ ├─ include\ ├─ x64\mingw\bin ├─ x64\mingw\lib └─ ...这里有个很重要的原则源码目录和构建目录必须分离也就是out-of-source构建。这一点在官方文档里也反复强调。有人为了省事直接在源码目录里执行CMake结果第一次配置失败后再想清干净就非常麻烦各种CMakeCache、CMakeFiles残留目录会干扰后续配置。我一开始就是因为这个折腾了一个晚上后面养成了“构建目录一旦乱了就直接删掉重建”的坏习惯反而省心。3. CMake配置的逐项拆解每个参数都值得花时间3.1 第一次按“常规套路”配置的结果初次尝试时可能很多人会按照以前Linux下编译的套路直接在CMake GUI里选一下源码路径然后Generate。但这里有个关键步骤CMake第一次Configure之前需要显式指定Qt的路径。如果不指定CMake只会检测到Qt的Core组件缺失然后自动把WITH_QT选项关闭接下来编译出的OpenCV的highgui模块就会退化成用Win32窗口无法跟Qt的Gui模块对接。我第一次遇到的情况是CMake配置阶段没有报错生成的时候也没问题但是一编译就报winrt相关错误或者highgui缺东西。原因就是WITH_QT被自动关掉了然后highgui用了很老的cv::namedWindow实现而我自己在Qt工程里写的是cv::imshow链接时自然就缺符号了。3.2 关键选项说明与完整命令行在CMake GUI里操作也可以但我个人更推荐用命令行方式尤其是后面需要反复清理配置时命令行历史的可复现性更高。以下是我确认可用的配置命令cd D:\opencv\build-qt cmake D:\opencv\sources -G MinGW Makefiles ^ -DCMAKE_BUILD_TYPERelease ^ -DCMAKE_MAKE_PROGRAMD:/Qt/Tools/mingw1120_64/bin/mingw32-make.exe ^ -DCMAKE_C_COMPILERD:/Qt/Tools/mingw1120_64/bin/gcc.exe ^ -DCMAKE_CXX_COMPILERD:/Qt/Tools/mingw1120_64/bin/g.exe ^ -DCMAKE_PREFIX_PATHD:/Qt/6.2.2/mingw_64 ^ -DWITH_QTON ^ -DWITH_OPENGLON ^ -DWITH_OPENCLOFF ^ -DBUILD_opencv_worldON ^ -DCMAKE_INSTALL_PREFIXD:/opencv/install这套参数里有几个值得单独说-DCMAKE_MAKE_PROGRAM如果不显式设置CMake可能去PATH里找mingw32-make找到的可能是老版本的导致编译过程中报各种奇怪的语法错误。-DWITH_OPENCLOFF我关闭了OpenCL因为MinGW版本的OpenCL头文件和库有些时候会出问题而且桌面应用场景下CPU处理就够了没必要引入GPU调度的复杂度。当然如果你后面要用CUDA那就另说了。-DBUILD_opencv_worldON这个选项会把所有模块编成一个统一的动态库opencv_world455.dll和对应的导入库。这样可以大大简化后期的链接配置不用在CMakeLists里列一堆opencv_core、opencv_imgproc、opencv_highgui了。缺点是库文件会比较大但个人开发用完全没问题。还有一个选项是-DWITH_CUDA这个默认是OFF的我这边没有NVIDIA显卡所以压根没考虑。如果你有CUDA环境并且需要GPU加速建议单独研究OpenCV的CUDA模块编译那个复杂度比现在这个要高不少不建议新手一上来就碰。重要如果你之前安装过Qt 5.x并且环境变量里设置了QT_DIR或者CMAKE_PREFIX_PATH指向Qt 5在配置Qt 6.2.2时必须把这些环境变量清掉否则CMake会优先找到Qt 5的模块然后在编译阶段报Qt5 not found或者各种版本相关的编译错误。3.3 Configure和Generate阶段应该看到的结果配置完成后CMake输出里会有一行类似这样的摘要信息GUI: QT: YES (Qt6 Core GUI Widgets) Win32 UI: YES OpenGL support: YES (QT6)只有看到QT对应的是YES并且后面括号里是Qt6才可以放心进入下一步。如果这里显示的是NO或者Qt5那趁早重新配置不要抱有侥幸心理。在摘要里还需要检查一下Media I/O: JPEG: YES PNG: YES TIFF: YES WEBP: YES OpenEXR: NO GDAL: NO这里JPEG/PNG/TIFF一般会编译内置的第三方库所以显示YES很正常。如果某个显示NO也不是致命问题只是对应格式的图片无法读写。我的经验是如果只是日常图像处理和Qt界面显示不全装这些编解码器影响不大而且省编译时间。4. 编译过程中的坑点与提速建议4.1 编译很慢怎么处理OpenCV 4.5.5的源码量不小全模块编译的话在普通配置的电脑上大概需要40分钟到1个小时。我这边是八代i5处理器16G内存用-j8参数并行编译大概花了40分钟左右。如果你电脑配置一般建议不要贪多用-j4或者干脆用cmake自带的并行参数cmake --build . --config Release -j 8或者直接mingw32-make -j8第一次编译时最好打开终端窗口盯着因为有些错误提示刷新很快一闪而过你可能根本不知道哪里出了问题。我有一次编译到90%的时候报错就是因为某个源代码文件里用了std::filesystem而MinGW的某些版本对文件系统库的支持不完整。解决办法是升级工具链或者加编译选项。不过4.5.5版本在GCC 11.2.0下编译还挺顺利没有遇到这个问题如果你用旧版本的MinGW可能就会在这里卡住。4.2 常见编译错误一览我把编译过程中遇到过的两个典型错误记录下来供参考错误一找不到windows.h或者winbase.h这个通常是因为MinGW没有进入CMake的搜索路径或者是构建目录是从之前MSVC版本残留复制的。解决办法删除build目录重新按上面的命令行配置一次确保CMAKE_C_COMPILER和CMAKE_CXX_COMPILER都指向Qt自带的MinGW路径。错误二编译某模块时报undefined reference to __imp_...这个一般是链接阶段的问题。多数情况下是因为某些库文件还没编译出来进程就提前结束了或者动态库导出符号表不完整。碰到这种情况先确认编译是否真的全部完成最后一行有没有出现Linking CXX shared library的提示如果报错发生在某几个特定模块且伴随乱码的DLL我建议把build文件删除重来——多试几次有时候就是配置缓存串了。4.3 编译产出物在哪里编译完成之后要记得执行安装步骤把所有头文件和库文件收集到统一目录。这一步很多人会忽略直接跑到build/lib目录里去找库但其实OpenCV提供了install目标可以把文件整理得更规范mingw32-make install或者cmake --build . --target install --config Release安装完成后D:/opencv/install目录下的结构大致是D:\opencv\install\ ├─ include\opencv2\... ├─ x64\mingw\bin\opencv_world455.dll ├─ x64\mingw\lib\libopencv_world455.dll.a └─ ...注意这里生成的是libopencv_world455.dll.a这是MinGW格式的导入库而不是MSVC的.lib文件。如果你拿到的是.lib且不带.dll.a后缀那说明你用的编译工具链不对回到第3节重新走一遍。5. 在Qt 6.2.2工程中接入这套OpenCV库5.1 CMakeLists.txt的配置模板编译好库之后怎么在Qt Creator里用起来是另一个大坑。Qt 6.2.2创建的默认工程是用CMake管理的而不是qmake。如果你还在用qmake的.pro文件建议尽早迁移到CMake因为Qt 6对CMake的支持已经非常完善而且OpenCV本身也提供CMake配置文件可以更优雅地接入。下面是我在项目里实际使用的CMakeLists.txt片段cmake_minimum_required(VERSION 3.16) project(MyOpenCVApp VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # OpenCV 路径 set(OpenCV_DIR D:/opencv/install/x64/mingw/lib/cmake/opencv4) find_package(OpenCV REQUIRED) # Qt6 find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) qt_standard_project_setup() qt_add_executable(MyOpenCVApp main.cpp mainwindow.cpp mainwindow.h ) target_include_directories(MyOpenCVApp PRIVATE ${OpenCV_INCLUDE_DIRS} ) target_link_libraries(MyOpenCVApp PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets ${OpenCV_LIBS} )这段配置里最关键的是那一行set(OpenCV_DIR ...)。因为OpenCV安装时生成的OpenCVConfig.cmake文件所在路径不是常规的/lib/cmake/opencv4如果你不确定路径可以安装后在D:\opencv\install目录下搜索OpenCVConfig.cmake把它的父目录填进去。5.2 运行时要设置的PATHC编译链接阶段的错误解决了还有运行时的动态库加载问题。很多人在Qt Creator里点运行程序起来后立刻弹窗说缺DLL其中最常见的就是opencv_world455.dll不在搜索路径里。解决办法有几种把D:/opencv/install/x64/mingw/bin加入系统PATH环境变量后重启Qt Creator在Qt Creator的运行环境设置里添加PATH条目更省事的办法把opencv_world455.dll直接复制到生成的exe同级目录。我个人推荐第三种因为打包分发时反正也要复制DLL提前养成这个习惯比较好。Qt 6还有一个细节它在运行时依赖的DLL也都在D:/Qt/6.2.2/mingw_64/bin目录下如果你之前没设置过Qt的环境变量在部署到别的机器上时可能会导致找不到Qt6Widgets.dll。用Qt自带的windeployqt工具可以自动收集这些依赖不过我一般是在CMake里直接把这个工具作为post-build步骤来调用省得手动跑。5.3 验证代码能不能显示一张图接入成功之后写个最简单的代码验证即可#include QApplication #include QLabel #include opencv2/opencv.hpp int main(int argc, char *argv[]) { QApplication app(argc, argv); cv::Mat image cv::imread(test.jpg); if (image.empty()) { return -1; } cv::cvtColor(image, image, cv::COLOR_BGR2RGB); QImage qimg(image.data, image.cols, image.rows, image.step, QImage::Format_RGB888); QPixmap pixmap QPixmap::fromImage(qimg); QLabel label; label.setPixmap(pixmap); label.show(); return app.exec(); }这段代码里有个细节值得多说一句OpenCV读取图像默认是BGR通道顺序而Qt的QImage使用RGB所以显示之前一定要cvtColor转换一次否则颜色偏蓝偏红。这是新手最容易忽略的地方。6. 一些容易反复踩的细节与最终建议6.1 关于MinGW和MSVC的抉择如果你不是对MinGW有特殊偏好或者你的项目必须依赖某些只有MSVC版本的第三方库我建议还是用MSVC方案——直接用Visual Studio安装MSVC工具链然后去OpenCV官网下载官方预编译的Windows版本配起来确实省心。但如果你和我一样主力IDE是Qt Creator就老老实实用MinGW编译。在Qt 6时代MinGW和MSVC两者编译出来的程序性能差异已经很小了况且日常桌面应用瓶颈主要在界面渲染和I/O不在单纯的计算循环。所以不用太纠结编译器之间的性能差距重点是保证整个工具链的一致性。6.2 是否需要开启world模块我前面强调了-DBUILD_opencv_worldON但还是要说一个它的代价编译时间变长生成的DLL体积大概在100MB以上。如果你的硬盘空间很紧张或者你只需要core、imgproc、highgui这三个模块可以指定只编译这几个模块这样能节省不少时间。不过对我个人来说world模块带来的便利是实打实的链接的时候一行opencv_world就够不需要在CMakeLists里堆一堆库名也不会因为少写一个组件导致链接失败。而且随着你后续用到calib3d、objdetect、video等更多功能world模块的好处就更明显了。6.3 编译失败后的心理建设和排查顺序编译失败不可怕可怕的是在错误的配置上反复重试。我总结了一套排查顺序基本能解决90%的问题清理build目录不是改几个CMake参数而是整个删除重新配置确认CMake输出摘要中QT、OpenGL均为YES确认编译器路径确实是Qt自带的MinGW而不是PATH里其他版本确认Windows系统PATH里没有残留的旧版libopencv库路径否则运行时可能加载错误版本的DLL如果报错信息里有MSVC相关字样检查是不是构建目录被之前的MSVC配置污染了。这套顺序看起来很基础但就是这些基础环节让我在第一次编译时浪费了一整天。6.4 关于后续升级Qt和OpenCV的版本更新很快以后想升级OpenCV版本时建议一并升级Qt工具链到对应版本。比如Qt 6.2.2内置的MinGW是11.2.0升级到Qt 6.4时内置的MinGW可能变成13.x这时候用旧的编译配置可能遇到新的兼容性问题。最好的做法是“升级Qt后重新编译OpenCV”不要试图把老版本的库文件直接拷贝到新环境里用。文章写到这里主要的内容基本都覆盖了。这套方案我自己用了几个月目前没再出过大问题希望对正在折腾QtOpenCV的朋友们有所帮助。如果编译过程中遇到另外的坑也欢迎一起交流毕竟工具链这种问题很多时候就是“一个人卡一周两个人五分钟”。本文还有配套的精品资源点击获取