一、写在开头

昨天遇到个使用QCefView套网页的应用,据技术人员描述程序在Debug环境下运行一切正常,发布为Release后运行报错。经过远程测试,实际情况与该技术人员描述一致,可稳定复现问题,收集到报错信息如下:

二、摸爬滚打

  1. 通过上述图片1可以得到错误信息,加载的资源文件不存在。对应解题思路就是给程序设置正确的资源路径即可。

    // build QCefConfig
    QCefConfig config;
    QDir dir = QApplication::applicationDirPath(); 		config.setLocalesDirectoryPath(QDir::toNativeSeparators(dir.filePath("resources/locales")));
    config.setBrowserSubProcessPath(QDir::toNativeSeparators(dir.filePath("CefViewWing")));
    config.setResourceDirectoryPath(QDir::toNativeSeparators(dir.filePath("resources")));
    

    经过测试程序运行依然报错,报错信息变为:

  2. 根据错误信息,可以得知当我们运行可执行程序的时候,可执行程序尝试去调用Qt5Cored.dll。由于dll以字母“d”结尾,可以断定该dll为Debug模式产物。

    qt5cored.dll是 Qt 应用框架的一个组件,主要用于开发和调试阶段,含有丰富的调试信息以便开发者在开发过程中有效地定位和解决问题。

  3. 初步判断是编译配置有问题,未使用Release模式编译项目。

    本项目是用的Visual Studio开发的,所以我把怀疑重点放在了项目配置文件上。经过查看项目配置文件,已设置为Release模式。

  4. 怀疑是因为环境变量设置问题,取消关于QT相关环境变量设置,无效。

  5. 手动拷贝非Debug模式下相关dll文件到Release可执行程序目录,无效。

  6. 使用windeployqt.exe发布dll文件到Release可执行程序目录,无效。其中在发布过程中出现以下提示信息,侧面证明Visual Studio编译配置设置无误。

    D:\workshop\pms-client\Win32\Release\xxx-xxx.exe 32 bit, release executable
    
  7. 使用Dependency Walker软件分析dll依赖情况。

    我在win11操作系统上使用软件时,遇到软件假死、无响应情况。经上网冲浪找到dependency作为替代软件,好用!结果如下:

    从图上分析可以得出,其实是QCefView.dll文件是使用的Debug模式编译的,依赖了Qt5Cored.dll,导致的报错。所以重新以Release模式编译QCefView项目,替换dll文件解决了。