使用 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】:platforms
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll
绝对不够部署。 depends.exe
可能会显示更多缺少的直接依赖项(正如 Chris 所建议的那样),但 Qt 也动态加载插件,depends.exe
不会显示它们。据我记得,至少还有一个“imageformat”插件文件夹也是必需的(为了让 png、jpg 格式正常工作)。
要么你可以使用windeployqt
命令,要么你自己弄清楚你需要什么。为此,我亲自从 Visual Studio 运行该程序。然后,Visual Studio 的“输出”窗口将列出所有正在加载的 dll(在运行时作为插件动态链接或加载)。您很可能会在此处看到与您未部署的 Qt 相关的那些。
我在生产计算机上构建和运行程序没有问题
提示:重命名生产计算机上安装/编译 Qt 的文件夹并运行您的程序。它很可能会开始失败。这是因为 Qt 库首先在当前路径中查找插件,如果没有找到,它会从编译它的文件夹中选择它们(绝对路径保存在二进制文件的某个位置)。这就是为什么它几乎总是在生产计算机上完美运行...
【讨论】:
以上是关于使用 Qt 的程序在另一台计算机上执行时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
我的 Blazor 服务器应用程序在一台本地计算机上的 Azure B2c 登录时遇到空引用错误,但在另一台本地计算机上没有,有啥想法吗?