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

9
我的exe在我编写它的电脑上完全正常运行。调试也没有问题,发布也没有问题,我可以将exe文件从“release”文件夹中移动到一个新文件夹,从C:\pathtoqt\ming47_32\bin中找到所需的.dll文件,并且它仍然可以正常运行。但是,当我尝试在另一台已包含.dll文件的计算机上运行此程序时,无法运行,并出现“应用程序请求运行时以异常方式终止”的错误信息。
我在2台Windows 7计算机和1台Windows XP计算机上进行了测试。我使用了依赖项查看器并下载了一堆.dll文件,但仍然无法解决问题。我设法使所有dll都处于“找到”状态或“红色”状态。
构建设置:http://puu.sh/3qTV3.png 我正在使用Qt5.0.2,mingGW 4.7 32位。
我也偶然发现了这个...http://puu.sh/3qU6j.png

4
永远不要下载DLL文件并在其他电脑上运行。很多DLL文件需要与系统上其他组件的版本相匹配,有些还需注册,有些需要作为一整个集合安装。请删除你所下载的DLL文件,告诉我们你缺少哪些DLL文件,我们会告诉你适当的安装方法。 - David Schwartz
5个回答

10
很可能,那些电脑上没有你的程序所使用的某些必需的Qt库。点击这里查看教程:http://doc.qt.io/qt-5/windows-deployment.html
另一个简单的检查方法是在另一台计算机上安装Qt,将你的 .exe 文件移动到那台计算机上并查看是否运行。如果可以,那么你肯定没有正确部署你的应用程序。
编辑以添加此有用链接,因为这似乎是人们所看到的完全相同的问题:https://bugreports.qt.io/browse/QTBUG-28766

我正在尝试运行第一个命令configure -static,但它显示环境中找不到perl - 无法运行syncqt。我需要在哪里安装perl以使其运行? - throwaway2013
2
老实说,我不确定,我的Qt经验有限。然而,你的问题可能也在于你手动从一台电脑复制DLL到另一台电脑。 - It'sPete
2
我们遇到了同样的问题,通过提供我回答中描述的额外共享库来解决。 - Sebastian Lange
1
这个 bug 链接非常有帮助 - 我进行了一些调查,并发现这确实是 Qt 中的一个 bug。请查看我在该 bug 上的评论获取更多信息(或者查看我在 Stack Overflow 上回答的问题)。 - Timmmm
@Timmmm,看一下Francois Colas在那个链接中的帖子,似乎是你正在经历的完全相同的问题。解决方法就在链接中。 - It'sPete
显示剩余2条评论

5
您正在部署一个由mingw编译的应用程序,这需要您提供以下DLL文件,并且除了您的应用程序使用的Qt-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文件要适合编译器版本。


它们已经提供了!正如问题和我所有的评论所述。此外,我认为您不需要qminimal.dll或qwindows.dll。至少对于我的Qt程序来说不需要。问题与Qt有关。该程序直到创建任何窗口之前都不会崩溃。 - Timmmm
1
所以你说你不需要qwindows.dll,但是当你打开一个窗口时你的程序崩溃了。嗯…… - It'sPete
尝试提供给定的dll文件...同时将它们放置在平台文件夹中。我们曾经遇到过同样的问题,并通过在子文件夹平台中提供DLL解决了它。 - Sebastian Lange
1
原来你确实需要qwindows.dll(但不需要qminimal.dll)。然而,Qt中存在一个bug,导致它无法在除了硬编码的搜索路径(c:\Qt\5.1.0....)之外找到qwindows.dll。据说可以使用qt.conf告诉它去哪里查找,但实际上并没有按照广告所述的那样工作。可能这个bug是特定版本的问题,这就是为什么人们看到不同行为的原因。我正在使用Qt 5.1.0-rc1版本。 - Timmmm
@Timmmm,所以你确实缺少了一个DLL(无论为什么你会缺少它)。虽然这是QT的问题,但这就是我发布的链接所解释的。这就解释了为什么你的“hello world”程序可以运行,但是构建窗口时却不行。 - It'sPete
显示剩余2条评论

5
如果您已经安装了cygwin,则可以运行ldd <your_app.exe>来查看应用程序所需的库列表。之后将您的exe复制到另一个文件夹中,并复制它所需的库。
这对于LGPL许可证应该是可以的,但我不是律师,请咨询一些熟悉法律问题的聪明人。

这种情况下问题不是缺少 DLL,如问题中所述。您也可以使用 Dependency Walker 而不是 ldd。 - Timmmm

3

这是Qt中的一个bug。

由于缺少一个插件DLL,因此出现了问题,但它是插件DLL,所以它不会在depends.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.issuetabpanels:comment-tabpanel#comment-216317


0
这是一个Windows上的错误:

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

具体来说,Qt只会在硬编码的绝对路径中寻找qwindows.dll(尽管depends.exe说不需要-它是动态加载的),该路径是安装在开发机器上的,即c:\Qt\.....\plugins\platforms。有一个名为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中。(如果您愿意,也可以将其放在.\plugins\platforms中,然后您只需要在上面更改dir.absolutePath()dir.absolutePath() + "/plugins"即可。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接