完证错误信息如下:

Debug控制台输出可以同时看到类似下面的信息:
QtTest.exe (15068): Loaded 'D:\Qt\6.8.3\msvc2022_64\plugins\styles\qmodernwindowsstyled.dll'. Symbols loaded.
Cannot mix incompatible Qt library (6.8.3) with this library (6.8.0)
Debug Error!
Program: D:\Qt\6.8.3\msvc2022_64\bin\Qt6Cored.dll
Module: 6.8.0
File: C:/Users/qt/work/qt/qtbase/src/corelib/kernel/qobject_p.h
Line: 233
Cannot mix incompatible Qt library (6.8.3) with this library (6.8.0)
(Press Retry to debug the application)
这个报错发生在一个使用了QOpenGLWidget的简单测试程序上,错误信息提示的很清楚,混用了不同版本的Qt库,网上也能搜到大把的同类问题,基本上都是说系统PATH路径里重叠了与执行程序加载的Qt库不同版本的动态库(动态库版本的Qt有很多DLL,除了主程序直接加载的,还有很多是以plugin方式按需动态加载的)。但是,我再三确认,当前环境部并存在这种情况,只有一个用Qt Maintenance Tool安装的预编译6.8.3版本在D;\Qt\6.8.3下!并且,如果一直忽略的话,程序也能正确运行,不过一直弹这个也很影响开发,所以还是要排查解决下。
一番排查后,还发现了一个奇怪的现象,如果在main.cpp里:
#include <QApplication>
// #include <QLabel>
#include "GLCubeWidget.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// QLabel *label = new QLabel("Hello Qt6!");
// label->setAlignment(Qt::AlignCenter);
// label->resize(300, 200);
// label->show();
GLCubeWidget *wdg = new GLCubeWidget();
wdg->resize(300, 200);
wdg->show();
return app.exec();
}
执行注释掉的只显示一个QLabel的代码,则完全没有问题,但如果执行的是显示GLCubeWidget这个继承自QOpenGLWidget的widget话,就会报开头提到的错误!
后来又经过一番排查后,最终定位到了问题,原来这套机器的环境之前测试发现过一个Qt 6.8.3的bug(没记错的话是关于窗口最大化后再拖动的),当时用了一个临时解决方案:将Qt6Cored、Qt6Guid、Qt6Widgetsd这几个dll,以及plugins\platforms\qwindowsd.dll替换为了6.8.0的版本!
因此,导致了如果只用到了涉及这几个库的功能,相当于完全是6.8.0的版本,没报任何错,但一旦用了涉及这几个库之外的功能,加载到的时候就会被Qt保护逻辑检测到问题,只要将替换过的库还原回6.8.3版本就可以解决了。
博主友情提示:
如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。