繁体   English   中英

无法在另一台计算机上运行我的exe文件。 “应用程序请求运行时以不寻常的方式终止它”错误

[英]Cannot run my exe file on another computer. “Application requested the runtime to terminate it in an unusual way” error

我的exe在我编程的计算机上运行完全正常。 它调试很好,发布很好,我可以将exe文件从'release'文件夹移动到一个新文件中,从C:\\ pathtoqt \\ ming47_32 \\ bin找到所需的.dll文件,它仍然运行正常。 但是,当我尝试在包含.dll文件的另一台计算机上运行此程序时,我无法执行此操作并且我得到“应用程序已请求运行时以不寻常的方式终止它”。

我在2台Windows 7计算机和1台Windows XP上测试了这个。 我使用了依赖walker并下载了一堆.dll,它仍然没有用。 我设法让所有的dll成为“找到”状态或“红色”状态。

构建设置: http//puu.sh/3qTV3.png

我使用的是Qt5.0.2,mingGW 4.7 32bit。

我也偶然发现了这个... http://puu.sh/3qU6j.png

这些计算机很可能没有您的程序正在使用的一些必需的Qt库。 请参阅此处的教程: http//doc.qt.io/qt-5/windows-deployment.html

另一个简单的检查是在另一台计算机上安装Qt,移动.exe并查看它是否运行。 如果是这样,您肯定没有正确部署您的应用程序。

编辑添加这个有用的链接,因为这似乎是人们看到的完全相同的问题: https//bugreports.qt.io/browse/QTBUG-28766

如果安装了cygwin,则可以运行ldd <your_app.exe>并查看应用程序所需的库列表。 执行此操作后,将您的exe复制到另一个文件夹和库所需的库。

对于LGPL许可证应该没问题,但我不是律师,所以请咨询一些熟悉法律问题的聪明人。

您正在部署mingw编译的应用程序,除了应用程序中使用的Qt-DLL之外,还需要提供以下DLL文件:

icudt51.dll
icuin51.dll
icuuc51.dll
libstdc++-6.dll (eventually)
platforms/qminimal.dll
platforms/qwindows.dll
libgcc_s_dw2-1.dll (eventually)

这些可以在SDK安装中找到的mingw目录中找到。

支持的DLL适合编译器版本也很重要。

这是Qt中的一个错误。

这是因为缺少DLL,但它是一个插件DLL,所以它不会出现在depends.exe中,而Qt不会在它应该的地方查找它。

简而言之,如果你将qwindows.dll(或用于调试版本的qwindowsd.dll)复制到你的部署机器上并放入相同的SAME ABSOLUTE PATH,即c:\\ Qt \\ _5.1.0 ..... 。\\ mingw48_32 \\ plugins \\ platforms \\ qwindows.dll,那么你的应用应该可行。 同一目录中存在空白的qt.conf文件不会影响我的开发计算机上的内容,但它确实阻止了应用程序在我的部署计算机上运行。

有关详细信息,请参阅此评论/错误报告: https//bugreports.qt.io/browse/QTBUG-28766?focusCommentId = 217317&page = com.atlassian.jira.plugin.system.issuetabpanels :comment-tabpanel#comment-216317

这是Windows上的一个错误:

https://bugreports.qt-project.org/browse/QTBUG-28766

具体来说,Qt只查找qwindows.dll(这必需的,尽管depends.exe说它 - 它是动态加载的)在它安装在您的开发机器上的硬编码绝对路径中,即c:\\Qt\\.....\\plugins\\platforms 有一个名为qt.conf的文件,您应该可以使用它来更改搜索路径,但它不起作用。

幸运的是,Joost Bloemen在该bug报告中提出了一个解决方法:

...

#include <windows.h>
#include <QFileInfo>

int main(int argc, char* argv[])
{
    // Bug workaround. See https://bugreports.qt-project.org/browse/QTBUG-28766
    wchar_t dirpath[MAX_PATH];
    GetModuleFileName(0, dirpath, MAX_PATH);
    QFileInfo dir(QString::fromWCharArray(dirpath));
    QApplication::addLibraryPath(dir.absolutePath());

    QApplication a(argc, argv);

...

然后将qwindows.dll您不需要qminimal.dll )放在EXE称为platforms的子目录中。 (你可以把它放在.\\plugins\\platforms如果你愿意,那么你只需要将dir.absolutePath()更改为dir.absolutePath() + "/plugins"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM