Cannot mix incompatible Qt library with this library报错的一种可能得原因

完证错误信息如下:

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<<处理后发布,原文只有博主可以看到。