尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Windows 10下Qt+OpenCV+MinGW开发环境配置全攻略

Windows 10下Qt+OpenCV+MinGW开发环境配置全攻略 1. 项目概述与核心价值在Windows 10上将Qt、OpenCV和MinGW这三者整合到一个流畅的C开发环境中是很多从事计算机视觉、图像处理或嵌入式GUI应用开发的同行们绕不开的一道坎。我自己在项目初期也踩过不少坑比如明明OpenCV的库编译成功了链接到Qt项目里却报一堆“undefined reference”错误或者Qt程序能跑但一调用OpenCV函数就崩溃。这背后的原因往往不是某个单一环节出错而是编译器MinGW、构建系统Qt的qmake或CMake和第三方库OpenCV之间的“三角关系”没有理顺。这个配置过程的核心价值在于构建一个统一、可移植且高效的本地开发环境。相比于直接使用Visual Studio的MSVC编译器MinGWMinimalist GNU for Windows提供了更接近Linux的开发体验其生成的程序依赖的运行时库是开源的部署起来更干净。Qt作为跨平台的C框架其信号槽机制和丰富的UI控件能快速构建应用界面。而OpenCV则是计算机视觉领域的“瑞士军刀”。将三者结合你就能在Windows平台上用熟悉的类Unix工具链开发出兼具友好交互界面和强大图像处理能力的桌面应用比如一个实时视频滤镜软件、一个图像标注工具或者一个集成了视觉算法的工业检测软件原型。这个过程不仅仅是“照着步骤做”更重要的是理解每一步背后的逻辑为什么OpenCV要用MinGW重新编译Qt的Kit配置里那几个路径到底指向哪里.pro文件里INCLUDEPATH和LIBS怎么写才不出错搞明白了这些你不仅能成功配置环境更能举一反三未来集成其他C库如Point Cloud Library, TensorFlow C API时也会游刃有余。2. 环境准备与工具链选型解析在动手之前我们需要对所需的“原材料”及其版本兼容性有一个清晰的认识。Windows下的C开发工具链的版本匹配是成功的第一步也是最容易埋坑的地方。2.1 核心组件版本选择策略我强烈建议在开始时就确定一个经过验证的版本组合而不是盲目追求最新版。以下是我多次实践后总结的一个稳定组合操作系统Windows 10 64位21H2或更高版本。确保系统更新到最新特别是Visual C Redistributable组件。Qt选择Qt 5.15.2的Open Source版本。这是Qt 5系列的长期支持版本社区资源丰富稳定性极高。虽然Qt 6已发布但其模块变化较大与一些旧版OpenCV的兼容性需要更多调整。从Qt官方安装程序Qt Online Installer中务必勾选MinGW 8.1.0 64-bit这个组件。这个MinGW版本是Qt官方维护和测试的与Qt的兼容性最好。OpenCV选择OpenCV 4.5.5或4.6.0。这些版本成熟稳定且与Qt 5.15.2的MinGW编译器兼容性好。我们将从源代码编译所以需要下载opencv-4.5.5-vc14_vc15.exe这是一个自解压的源码包vc14_vc15指它也支持MSVC但不影响我们或直接从GitHub克隆对应tag的源码。CMake这是编译OpenCV的必备工具下载CMake 3.25及以上版本的64位安装包即可。MinGW虽然Qt安装包自带了一个MinGW但为了确保环境纯净和路径简单强烈建议直接使用Qt安装目录下的那一个。它的路径通常类似于C:\Qt\Tools\mingw810_64。不要从其他渠道额外安装一个MinGW避免多个g编译器在系统路径中冲突。注意版本锁定的关键在于编译器ABI应用二进制接口的兼容性。Qt 5.15.2自带的MinGW是8.1.0它使用的是GCC 8.1.0的运行时库如libstdc-6.dll。我们编译OpenCV时必须使用完全相同的或ABI兼容的编译器否则编译出的OpenCV库与Qt程序链接时会因为C标准库的内部结构不一致而导致运行时崩溃。2.2 系统环境变量与开发工具准备在安装好上述软件后需要正确配置系统环境变量这是让命令行工具找到编译器的关键。将Qt的MinGW加入PATH打开“系统属性” - “高级” - “环境变量”。在“系统变量”或“用户变量”中找到并编辑Path变量。添加一条新路径指向Qt的MinGW的bin目录例如C:\Qt\Tools\mingw810_64\bin。验证打开一个新的命令提示符CMD或PowerShell输入g --version和mingw32-make --version。如果正确显示了GCC 8.1.0和Make的版本信息说明配置成功。这个mingw32-make是MinGW附带的构建工具我们编译OpenCV时会用到。安装并配置CMake-GUI运行CMake安装程序安装时选择“为所有用户添加CMake到系统PATH”。我们主要使用它的图形界面CMake-GUI这比命令行方式更直观便于配置复杂的OpenCV编译选项。准备一个干净的开发目录建议在非系统盘如D盘创建一个清晰的工作目录例如D:\Dev\opencv_mingw。在这个目录下可以创建两个子文件夹build用于存放CMake生成的中间文件和编译输出和install用于存放最终编译好的库文件和头文件。这种源码source、构建build、安装install分离的目录结构是标准的做法便于管理和清理。3. 编译OpenCV with MinGW详细流程这是整个配置过程中最核心、也最容易出错的一步。我们的目标是用Qt附带的MinGW编译器将OpenCV源码编译成.a静态库和.dll动态库文件并安装到指定的install目录。3.1 使用CMake-GUI配置生成Makefile启动CMake-GUI在“Where is the source code”栏选择你解压OpenCV源码的目录例如D:\Dev\opencv_mingw\opencv-4.5.5\sources。在“Where to build the binaries”栏选择你创建的build目录例如D:\Dev\opencv_mingw\build。点击“Configure”按钮。此时会弹出一个对话框让你选择编译器。Specify the generator for this project选择“MinGW Makefiles”。Specify native compilers点击“Next”。在C编译器路径中点击“Browse”并导航到C:\Qt\Tools\mingw810_64\bin\gcc.exe。在C编译器路径中同样浏览选择C:\Qt\Tools\mingw810_64\bin\g.exe。点击“Finish”。CMake开始第一次配置分析你的系统和源码。关键配置选项调整 第一次配置完成后CMake界面会列出很多红色的配置项。我们需要关注并修改以下几项CMAKE_BUILD_TYPE对于开发调试设为Release或Debug。如果你想同时拥有调试信息可以后续通过-DCMAKE_BUILD_TYPERelWithDebInfo来设置但初次编译建议用Release。CMAKE_INSTALL_PREFIX这是最重要的路径将它设置为你准备好的install目录例如D:\Dev\opencv_mingw\install。编译安装后所有的头文件在include子目录、库文件在lib和bin子目录都会放在这里。WITH_OPENGL勾选。如果你开发的Qt程序可能用到OpenGL进行高性能图像渲染这个选项有用。WITH_QT不要勾选这是一个经典的坑。OpenCV内部的这个WITH_QT选项是指用Qt来替换OpenCV自带的highgui模块的窗口后端。但我们的目标是将OpenCV作为库链接到我们自己的Qt程序中两者是独立的。勾选它会导致编译复杂化且可能产生冲突。我们只需要OpenCV的核心功能。BUILD_opencv_world建议勾选。这个选项会将所有OpenCV模块core, imgproc, highgui等编译成一个巨大的libopencv_world450.dll对应OpenCV 4.5.x和对应的.a导入库。对于初学者这极大地简化了链接步骤你只需要链接这一个库文件而不是几十个。缺点是生成的动态库文件很大。ENABLE_CXX11确保它是ON默认就是。在搜索框输入“test”找到BUILD_TESTS和BUILD_PERF_TESTS将它们设为OFF可以节省编译时间。再次点击“Configure”。此时红色条目会减少或消失。如果还有红色通常是CMake发现了新的依赖如FFmpeg但没找到可以根据提示路径或选择不编译相关模块。反复点击“Configure”直到没有红色错误条目。最后点击“Generate”。如果成功输出窗口会显示“Generating done”。此时在你的build目录下CMake已经生成了适用于MinGW的Makefile文件。3.2 执行编译与安装命令现在我们需要使用MinGW的make程序来执行编译。打开一个命令提示符CMD或 PowerShell务必以管理员身份运行因为安装步骤会向install目录写入文件可能需要权限。使用cd命令切换到你的build目录cd D:\Dev\opencv_mingw\build。执行编译命令。这里使用mingw32-make并指定-j参数以利用多核CPU加速编译数字4表示使用4个线程你可以根据自己CPU的核心数调整mingw32-make -j4这个过程会持续较长时间十几分钟到一小时不等取决于你的电脑性能。请耐心等待观察输出是否有致命的错误error信息。常见的警告warning可以忽略。编译成功后执行安装命令将编译好的文件复制到CMAKE_INSTALL_PREFIX指定的目录mingw32-make install完成后检查你的install目录例如D:\Dev\opencv_mingw\install应该会看到bin,include,lib等子文件夹。lib文件夹里会有libopencv_world450.dll.a导入库和libopencv_world450.a静态库bin文件夹里会有opencv_world450.dll运行时动态库。实操心得编译过程中如果报错“找不到-lxxx”通常是某个依赖库缺失。一个常见的解决办法是在CMake配置时在搜索框输入“protobuf”找到PROTOBUF_UPDATE_FILES把它勾选上然后重新Configure和Generate。这会让CMake自动下载并编译所需的protobuf库。4. Qt项目配置与集成实战OpenCV库编译好后下一步就是在Qt Creator中创建一个项目并正确配置让Qt项目能找到并使用我们编译的OpenCV。4.1 创建Qt项目并配置Kit打开Qt Creator新建一个“Qt Widgets Application”项目。在“Kit Selection”页面关键一步是选择正确的Kit。你应该能看到一个名为“Desktop Qt 5.15.2 MinGW 64-bit”的套件。确保它被选中。这个Kit的编译器就是我们之前用的MinGW 8.1.0。项目创建好后打开项目根目录下的.pro文件Qt的项目配置文件。我们将在这里添加OpenCV的包含路径和库文件。4.2 编辑.pro文件集成OpenCV.pro文件的配置是链接的核心。我们需要告诉qmakeQt的构建工具两件事去哪里找OpenCV的头文件以及去哪里链接OpenCV的库文件。假设你的OpenCV安装目录是D:\Dev\opencv_mingw\install下面是一个典型的配置示例# 你的其他Qt模块配置例如 QT core gui greaterThan(QT_MAJOR_VERSION, 4): QT widgets # 1. 指定OpenCV头文件路径 # INCLUDEPATH 是qmake的变量用于添加编译时的头文件搜索路径 INCLUDEPATH D:\Dev\opencv_mingw\install\include # 2. 指定OpenCV库文件路径 # LIBS 变量用于添加链接器选项 # -L 指定库文件所在的目录 # -l 指定要链接的库名去掉前缀‘lib’和后缀‘.a’ # 因为我们使用了world模块所以只需要链接一个库 # 方式A链接动态库推荐便于部署和更新 LIBS -LD:\Dev\opencv_mingw\install\lib \ -lopencv_world450 # 方式B链接静态库生成独立exe但文件巨大 # LIBS -LD:\Dev\opencv_mingw\install\lib \ # -lopencv_world450 # 注意静态链接可能需要额外定义宏如 -DOPENCV_STATIC并且要处理OpenCV依赖的其他静态库如zlib, libjpeg等非常复杂新手不推荐。 # 3. 可选但重要确保程序运行时能找到.dll文件 # 对于动态链接编译出的exe运行时需要能找到opencv_world450.dll。 # 一种方法是将DLL复制到exe同级目录另一种是在.pro文件中添加部署步骤。 # 这里提供一个简单的后构建步骤在编译后自动拷贝DLL。 # 注意路径中的斜杠是‘/’并且要转义空格如果有。 win32: { # 定义源DLL路径和目标路径当前构建目录 OPENCV_DLL_PATH $$shell_path(D:/Dev/opencv_mingw/install/bin/opencv_world450.dll) DESTDIR $$shell_path($$OUT_PWD) # 输出目录通常是debug或release子文件夹 # 添加后构建命令 QMAKE_POST_LINK $$quote(cmd /c copy /Y $${OPENCV_DLL_PATH} $${DESTDIR}$$escape_expand(\\n\\t)) }配置解析INCLUDEPATH添加后你在代码中写#include opencv2/core.hpp时编译器就会去你指定的目录里查找。LIBS-L指定库目录-l指定库名。注意-lopencv_world450链接器会在这个目录下寻找名为libopencv_world450.dll.a用于动态链接或libopencv_world450.a用于静态链接的文件。QMAKE_POST_LINK这是一个qmake变量用于指定在链接完成后执行的命令。我们利用它在每次构建成功后自动将必需的DLL文件从OpenCV的bin目录复制到可执行文件所在的目录。这能避免运行时出现“找不到xxx.dll”的错误。4.3 编写测试代码验证环境配置好.pro文件后点击Qt Creator左下角的“构建”按钮锤子图标如果没有报错说明链接配置基本正确。接下来在mainwindow.cpp中写一段简单的OpenCV代码来测试。#include mainwindow.h #include ui_mainwindow.h // 引入OpenCV核心头文件 #include opencv2/core.hpp #include opencv2/imgcodecs.hpp #include opencv2/highgui.hpp #include QDebug MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui-setupUi(this); // 测试1检查OpenCV版本 qDebug() OpenCV version: CV_VERSION; // 测试2创建一个简单的OpenCV矩阵并打印 cv::Mat testMat cv::Mat::eye(3, 3, CV_8UC1); qDebug() Test matrix:; for(int i 0; i testMat.rows; i) { QString rowStr; for(int j 0; j testMat.cols; j) { rowStr QString::number(testMat.atuchar(i, j)) ; } qDebug() rowStr; } // 测试3尝试读取一张图片请确保项目目录下有一张test.jpg图片 cv::Mat image cv::imread(test.jpg); if(image.empty()) { qDebug() Could not open or find the image!; } else { qDebug() Image loaded successfully. Size: image.cols x image.rows; // 可以尝试显示图片但OpenCV的highgui窗口可能与Qt事件循环冲突在纯Qt程序中慎用cv::imshow。 // cv::imshow(Test Image, image); // cv::waitKey(0); } } MainWindow::~MainWindow() { delete ui; }运行程序绿色三角箭头。如果能在Qt Creator的“应用程序输出”面板看到正确的OpenCV版本号和矩阵信息并且能成功读取图片信息那么恭喜你Qt OpenCV MinGW的环境已经成功配置并验证通过5. 高级配置、问题排查与优化即使通过了基础测试在实际项目开发中你仍可能遇到各种问题。下面是一些进阶配置和常见问题的解决方案。5.1 使用CMake管理QtOpenCV项目替代qmake对于更复杂的项目特别是需要集成多个第三方库时使用CMake作为项目构建系统比qmake更强大、更通用。Qt Creator也完美支持CMake项目。在Qt Creator中新建项目时选择“Non-Qt Project” - “Plain C Application”或者“Import Existing Project”并选择你的CMakeLists.txt。创建一个CMakeLists.txt文件内容示例如下cmake_minimum_required(VERSION 3.16) project(MyQtOpencvApp LANGUAGES CXX) # 1. 查找所需的Qt组件 set(CMAKE_AUTOMOC ON) # 自动处理Qt的moc set(CMAKE_AUTORCC ON) # 自动处理资源文件 set(CMAKE_AUTOUIC ON) # 自动处理ui文件 find_package(Qt5 COMPONENTS Widgets REQUIRED) # 2. 查找OpenCV # 设置OpenCV_DIR变量指向你编译OpenCV时build目录下的CMake配置文件所在位置 # 通常是 你的build目录/lib/cmake/opencv4 set(OpenCV_DIR D:/Dev/opencv_mingw/build/lib/cmake/opencv4) find_package(OpenCV 4.5 REQUIRED) # 3. 添加可执行文件 add_executable(${PROJECT_NAME} main.cpp mainwindow.cpp mainwindow.ui ) # 4. 链接库 target_link_libraries(${PROJECT_NAME} Qt5::Widgets ${OpenCV_LIBS} ) # 5. 包含目录会自动由find_package设置无需手动指定在Qt Creator中打开这个CMake项目它会自动配置Kit并生成构建系统。这种方式管理依赖更清晰跨平台性也更好。5.2 常见编译与运行时错误排查错误undefined reference to ‘cv::imread(...)’等链接错误原因.pro文件中的LIBS路径或库名写错或者没有链接opencv_world库而是尝试链接了具体的模块如-lopencv_core但没链接全。解决检查-L后的路径是否正确以及-l后的库文件名是否正确注意去掉lib前缀和.a或.dll.a后缀。如果使用world模块确保只链接了-lopencv_world450这一个库。错误程序编译成功但运行时崩溃或提示“找不到libopencv_world450.dll”原因动态链接库DLL没有放在exe可执行文件能搜索到的路径下。Windows搜索DLL的顺序包括exe所在目录、系统目录、PATH环境变量中的目录。解决方法一临时将install/bin目录下的所有OpenCV相关DLL主要是opencv_world450.dll和它可能依赖的opencv_videoio_ffmpeg450_64.dll等手动复制到你的Qt项目构建输出目录debug或release文件夹。方法二推荐如前文所述在.pro文件中使用QMAKE_POST_LINK自动拷贝。方法三全局将install/bin目录添加到系统的PATH环境变量中。但这种方法可能会影响其他程序不推荐作为首选。错误Qt Creator构建时提示“Cannot run compiler ‘g’. Output...”原因Qt Creator没有找到正确的MinGW编译器或者Kit配置错误。解决打开Qt Creator的“工具” - “选项” - “Kits” - “编译器”。检查MinGW编译器的路径是否指向了Qt自带的mingw810_64\bin\g.exe。然后在“Kits”标签页确保你项目使用的Kit所选择的编译器是这个正确的MinGW。OpenCV HighGUI窗口与Qt事件循环冲突现象在Qt的main函数或窗口构造函数中调用cv::imshow()和cv::waitKey()可能导致Qt界面卡死或无响应。原因OpenCV的highgui模块有自己的事件循环而Qt也有自己的主事件循环。两者在同一个线程中阻塞式等待如waitKey(0)会产生冲突。解决最佳实践避免在Qt GUI线程中使用cv::imshow。如果需要显示OpenCV图像应该使用Qt的QLabel或QGraphicsView来显示。可以通过cv::cvtColor将BGR格式的cv::Mat转换为RGB格式然后使用QImage和QPixmap进行转换和显示。如果必须用HighGUI可以考虑将OpenCV的显示代码放在一个独立的线程中或者使用非阻塞的waitKey(1)并在Qt定时器中循环调用但这并非优雅的解决方案。5.3 部署发布时的注意事项当你开发完成需要将程序发布给没有开发环境的用户时需要打包必要的运行时文件。必需的文件你的可执行文件.exe。Qt的运行时DLL这些文件位于Qt安装目录的bin文件夹下例如Qt5Core.dll,Qt5Gui.dll,Qt5Widgets.dll。你可以使用Qt自带的命令行工具windeployqt.exe来自动收集这些依赖。在命令行中切换到你的exe所在目录执行windeployqt your_app.exe。OpenCV的DLL将install/bin目录下的opencv_world450.dll及其可能依赖的FFmpeg DLL如opencv_videoio_ffmpeg450_64.dll一起复制到exe同级目录。MinGW运行时DLL主要是libstdc-6.dll,libgcc_s_seh-1.dll,libwinpthread-1.dll。它们位于Qt的MinGW的bin目录下C:\Qt\Tools\mingw810_64\bin。使用windeployqt这是Qt提供的部署工具能极大简化Qt库依赖的收集。确保你的Kit是MinGW版本并且命令行环境能找到windeployqt它通常在Qt安装目录\版本号\mingw版本号\bin下。运行后它会自动将所需的Qt DLL、插件和翻译文件复制到exe目录。测试将所有这些DLL和exe放在一个干净的文件夹中在另一台没有安装Qt和OpenCV的Windows 10电脑上运行确保一切正常。配置环境的过程虽然繁琐但一旦打通你就拥有了一个强大的本地开发工作站。这套环境尤其适合需要快速原型验证、算法开发与GUI展示结合的场景。我个人的体会是前期在版本选择和路径配置上多花十分钟仔细核对远比后面花几个小时去排查莫名其妙的链接错误要划算得多。当你的第一个Qt界面成功加载并处理了一张OpenCV图片时那种成就感会让你觉得这一切都是值得的。如果在集成更复杂的库时遇到问题记住核心思路永远是保持编译器一致、理清头文件与库文件的路径、处理好动态库的运行时依赖。
返回列表