无法在另一台计算机上运行我的 exe 文件。 "Application requested the runtime to terminate it in an unusual way"错误



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

我已经在2台Windows7电脑和1台WindowsXP上测试过了。我使用了dependencywalker,下载了一堆.dll,但它仍然不起作用。我设法使所有dll都处于"已找到"状态或"红色"状态。

生成设置:http://puu.sh/3qTV3.png

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

我也偶然发现了这个。。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,所以它不会显示在dependens.exe中,Qt也不会在它应该查找的地方查找它。

长话短说,如果您将qwindows.dll(或用于调试构建的qwindowsd.dll)复制到您的部署机器上,并将其放在与其来源相同的绝对路径中,即c:\Qt\5.1.0……\mingw48_32\plugins\platforms\qwindows.dll,那么您的应用程序应该可以工作。在同一目录中出现一个空白的qt.conf文件并没有影响我的开发机器,但它确实阻止了应用程序在我的部署机器上工作。

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

这是Windows上的一个错误:

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

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

幸运的是,Joost Bloemen在错误报告中想出了一个变通办法:

...
#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的子目录中。(如果你愿意,你可以把它放在.pluginsplatforms中,然后你只需要把dir.absolutePath()改为上面的dir.absolutePath() + "/plugins"

相关内容

最新更新