本文记录了我使用 Qt5.12.3 自带的 MinGW64 编译器与 CMake 成功编译 OpenCV 4.5.4(含 opencv_contrib 扩展模块)的详细过程。适用于需要在 Windows 环境下使用 Qt 和 OpenCV 进行开发的用户。
一、环境准备
1. 软件版本说明
-
Qt:5.12.3(自带 MinGW 7.3.0 64 位)
-
CMake:3.22.3(请确保版本 ≥ 3.10)
-
OpenCV:4.5.4(含 opencv_contrib 扩展模块)
-
操作系统:Windows 10 64 位
二、版本选择
1. protobuf 版本兼容性问题
-
OpenCV 4.5.5 内置的 protobuf 3.19 使用了较新的 C++ 语法特性;
-
Qt 5.12.3 自带的 MinGW 7.3.0(gcc 7.3.0)编译器对这些新语法支持不完善;
-
编译时会报错:
error: temporary of non-literal type 'google::protobuf::internal::CallOnceInitializedMutex<std::mutex>' in a constant expression
-
OpenCV 4.5.4 使用的 protobuf 3.5.1 语法更保守,与 MinGW 7.3.0 完全兼容。
2. OpenGL 链接问题
-
当启用 WITH_OPENGL 选项时,OpenCV 4.5.5 编译会失败;
-
出现 OpenGL 函数未定义的链接错误:
undefined reference to `_imp__glHint@8'
undefined reference to `_imp__glViewport@16' -
虽然可能通过手动链接 OpenGL 库解决,但 OpenCV 4.5.4 在该配置下编译更稳定。
三、CMake 配置步骤
1. 打开 CMake GUI
-
设置源代码目录(OpenCV 源码路径)
-
设置构建目录(建议新建一个 build 或 MinGW64 文件夹)
2. 配置编译器

-
点击 Configure,选择:
-
Specify the generator for this project:MinGW Makefiles
-
Specify native compilers

-
-
填写编译器路径(根据你的 Qt 安装路径调整):
-
C:D:/QT/Qt5.12.3/Tools/mingw730_64/bin/gcc.exe
-
C++:D:/QT/Qt5.12.3/Tools/mingw730_64/bin/g++.exe

-
-
点击 Finish,等待初始配置完成。
3. 添加扩展模块
-
搜索 OPENCV_EXTRA_MODULES_PATH,设置值为:
D:/OpenCV/opencv454/opencv_contrib-4.5.4/modules

4. 启用 Qt 与 OpenGL 支持
-
搜索 WITH_QT,勾选
-
搜索 WITH_OPENGL,勾选
5. 重新配置
-
点击 Configure,直到红色条目全部消失。
-
最后点击 Generate,生成 Makefile。

四、编译与安装
1. 打开终端
进入构建目录(如 D:/OpenCV/opencv454/MinGW64)。
2. 执行编译
mingw32-make -j8
-j8 表示使用 8 线程加速编译,可根据 CPU 核心数调整。

3. 执行安装
mingw32-make install
安装完成后,生成的文件会位于 install 目录下。
五、环境配置与验证
1. 添加 PATH 环境变量
将以下路径添加到系统 PATH 环境变量中(建议放在最前面):
D:\\QT\\Qt5.12.3\\5.12.3\\mingw73_64\\bin

2. 验证编译成功
编写一个简单的 Qt + OpenCV 测试程序,包含:
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
cv::Mat img = cv::imread("test.jpg");
if (!img.empty()) {
std::cout << "OpenCV 编译成功!" << std::endl;
}
return 0;
}
编译并运行,确认无错误。
六、常见问题
1. 编译时出现 protobuf 相关错误
说明 OpenCV 版本过高,建议降级至 4.5.4 或更低版本。
2. 链接时出现 OpenGL 相关错误
检查是否已正确安装 Qt 的 OpenGL 组件,或在 CMake 中暂时关闭 WITH_OPENGL。
3. 编译过程中卡顿或内存不足
减少编译线程数,如使用 -j4 或 -j2。
网硕互联帮助中心




评论前必须登录!
注册