使用 Qt 的程序在另一台计算机上执行时崩溃

Posted

技术标签:

【中文标题】使用 Qt 的程序在另一台计算机上执行时崩溃【英文标题】:Program with Qt crashes when executed on an other computer 【发布时间】:2016-05-24 13:45:07 【问题描述】:

我在部署 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。

对此问题的任何帮助将不胜感激。 提前谢谢你!

【问题讨论】:

你用过windeployqt命令吗?这是确保大多数依赖项(无论如何来自 qt 方面)都存在的简单方法。另外,您是否在您的 exe 上使用了依赖行程序以确保没有其他库丢失?最后,读取 0x000000 的错误可能是一个空指针异常,你确定那一边被安全处理了吗? 嗨,克里斯,我刚刚尝试了添加更多文件的 windeployqt 命令,但在另一台计算机上运行该程序时出现了同样的错误。 Dependency walker 并没有真正的帮助,因为我读到的许多 API-MS-WIN-XXXXXX 之类的错误与其他主题无关。其他依赖项似乎很好。最后,我不知道会在哪里抛出空指针异常,您知道如何获取有关这一点的更多信息吗?整个程序在我的主计算机上正常运行,但我会尝试检查 GUI 的构造函数。再次感谢您 所以我会检查depends.exe是否有任何不以api-ms开头的错误。具体查看 qt 或 caffe 库名称。当你在目标计算机上调试时,你能不能不只是在开始时设置一个断点并一直走下去,直到它给你一个错误?这将极大地帮助您找到来源。不必担心调用堆栈,而不必担心它尝试执行的最后一行代码。这可能需要一点时间。您也可以尝试将您的代码包装在一个大尝试中...catch 并使用 boost 诊断错误消息或类似的东西来获得更好的提示。 【参考方案1】:

platformsQt5Core.dllQt5Gui.dllQt5Widgets.dll 绝对不够部署。 depends.exe 可能会显示更多缺少的直接依赖项(正如 Chris 所建议的那样),但 Qt 也动态加载插件,depends.exe 不会显示它们。据我记得,至少还有一个“imageformat”插件文件夹也是必需的(为了让 png、jpg 格式正常工作)。

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

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

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

【讨论】:

以上是关于使用 Qt 的程序在另一台计算机上执行时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

我的 Blazor 服务器应用程序在一台本地计算机上的 Azure B2c 登录时遇到空引用错误,但在另一台本地计算机上没有,有啥想法吗?

如何在另一台安装了 qt 的计算机(linux)上运行 qt 程序?

OpenCV 程序无法在另一台计算机上运行

VS2010 应用程序无法在另一台计算机上运行

尝试在另一台计算机上使用 glm 模型进行预测时出错

我可以通过调用在另一台计算机上运行 linux/windows 的计算机上运行 python 脚本吗? [复制]