c++ - Qt 程序在另一台计算机上执行时崩溃

标签 c++ visual-studio qt dll deployment

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

我在生产计算机上构建和运行程序没有问题,但是当我尝试在具有类似配置的另一台计算机上运行它时,它就崩溃了。

部署规范

让我更具体地说明我的部署方法和错误。

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

  • 平台(Qt 文件夹)
  • Qt5Core.dll
  • Qt5Gui.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。

如能提供有关此问题的任何帮助,我们将不胜感激。 提前谢谢你!

最佳答案

platforms Qt5Core.dll Qt5Gui.dll Qt5Widgets.dll 绝对不够部署。 depends.exe 可能会显示更多缺失的直接依赖项(正如 Chris 所建议的),但 Qt 也会动态加载插件,而 depends.exe 不会显示它们。据我所知,至少还需要“imageformat”插件文件夹(要使 png、jpg 格式正常工作)。

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

I have no problem with building and running the program on the production computer

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

关于c++ - Qt 程序在另一台计算机上执行时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37415531/

相关文章:

c++ - 单独键入每个库编译,但单个静态库存档失败

c++ - 杀死父进程时杀死所有子进程

c# - Convert.ToDouble 中忽略小数点

visual-studio - 是否可以在安装向导项目中注册环境变量?

c++ - 如何在没有 webengine 的情况下构建 Qt5?

c++ - 访问多个数组时 cpu 缓存做什么?

c++ - 256 位 Rijndael block 大小?

c++ - 调试 Visual Studio C++ 应用程序并查找导致崩溃的特定函数

qt - 如何在 QLIstWidgetItem 中的文本左侧设置图标?

c++ - 从插槽调用QApplication::processEvents导致再次调用同一插槽