带有Qt的程序在其他计算机上执行时崩溃

Program with Qt crashes when executed on an other computer

本文关键字:执行 崩溃 计算机 其他 Qt 程序 带有      更新时间:2023-10-16

我在部署Qt程序时遇到了一个问题。这是一个跨平台程序(Linux/Mac/Windows),当我试图在Windows 10上部署用Visual Studio 2015构建的Win32版本时,我遇到了一个问题。

我在生产计算机上构建和运行程序没有问题,但当我试图在其他具有类似配置的计算机上运行它时,它就会崩溃。

部署规范

让我更具体地介绍一下我的部署方法和错误。

像往常一样,我在我的发布可执行文件中添加了以下dll:

  • 平台(Qt文件夹)
  • Qt5Core.dll
  • Qt5Guid.dll
  • Qt5Widgets.dll

和Visual Studio 2015可再发行(x86)

错误消息

我得到的崩溃消息是:

Unhandled exception at 0x56E5D96A (Qt5Core.dll) in snapr_exe.exe:
0xC0000005: Access violation reading location 0x00000000.
If there is a handler for this exception, the program may be safely continued.

当我尝试使用Visual Studio 2015在目标计算机上调试程序时,我获得了以下调用堆栈:

Qt5Core.dll!56e5d96a()  Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for Qt5Core.dll]   
Qt5Gui.dll!572eb949()   Unknown
snapr_exe.exe!013c4ae1()    Unknown
[External Code] 
Qt5Core.dll!56e3d964()  Unknown
Qt5Gui.dll!57269edf()   Unknown
Qt5Gui.dll!5725bdc5()   Unknown
snapr_exe.exe!013f453c()    Unknown
snapr_exe.exe!013c1305()    Unknown
[External Code] 

其他相关信息

在开发的前一步,我可以生成一个集成Qt5的可执行文件,它可以在两台计算机上运行。从那时起,我链接了caffe深度学习库,并高度定制了Qt5用户界面。

更重要的是,我向Dependency Walker仔细检查了一下,我包含的dll实际上是X86 dll。

如果能在这个问题上提供任何帮助,我们将不胜感激。提前谢谢!

platformsQt5Core.dllQt5Gui.dllQt5Widgets.dll绝对不足以进行部署。depends.exe可能会显示更多缺失的直接依赖项(正如Chris所建议的),但Qt也会动态加载插件,depends.exe不会显示它们。据我记忆所及,至少还有一个"imageformat"插件文件夹也是必需的(png、jpg格式才能正常工作)。

要么你可以使用windeployqt命令,要么你自己弄清楚你需要什么。为此,我亲自从Visual Studio运行该程序。然后,Visual Studio的"输出"窗口将列出所有正在加载的dll(在运行时作为插件动态链接或加载)。您很可能会在这里看到与您没有部署的Qt相关的那些。

我在生产计算机上构建和运行程序没有问题

提示:重命名生产计算机上安装/编译Qt的文件夹并运行程序。它很可能会开始失败。这是因为Qt库首先在当前路径中查找插件,如果没有找到,它会从编译的文件夹中挑选插件(绝对路径保存在二进制文件中的某个位置)。这就是为什么它几乎总是在生产计算机上完美工作。。。