带有Qt的程序在其他计算机上执行时崩溃
Program with Qt crashes when executed on an other computer
我在部署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。
如果能在这个问题上提供任何帮助,我们将不胜感激。提前谢谢!
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库首先在当前路径中查找插件,如果没有找到,它会从编译的文件夹中挑选插件(绝对路径保存在二进制文件中的某个位置)。这就是为什么它几乎总是在生产计算机上完美工作。。。
- 执行函数时导致崩溃的变量
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- Linux 可执行文件通过 dlopen 在emplace_back崩溃打开共享库
- 测试操作系统时执行程序集"sti"时虚拟框崩溃
- 在目标计算机上访问 POSIX 信号灯时出现可执行文件崩溃(SEGV_MAPERR)
- 执行递归函数时 C++ 应用程序崩溃
- 应用程序在 C++ QT 上执行 sql 后崩溃
- 程序在开关中执行第二种情况后崩溃
- std::map<string, int> 在执行 m[0] 时崩溃
- 如何在启动过程中崩溃时使用 gdb 调试可执行文件
- 为什么在Shell输出中运行的可执行操作到stdout,而不是崩溃时的stderr
- 是否可以在程序崩溃后执行代码?
- 程序在循环执行后崩溃
- 当静态对象执行静态对象时,崩溃
- 当托管它崩溃的可执行过程时,全局挂钩会发生什么
- 在执行字符串时更改字符会使程序崩溃
- 带有Qt的程序在其他计算机上执行时崩溃
- C 时间类没有编译错误,执行停止和应用程序在CheckDay函数中崩溃错误
- C++可执行文件崩溃
- 执行析构函数时,服务器应用程序总是崩溃