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

问题描述 投票:0回答:5

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

我已经在 2 台 Windows 7 计算机和 1 台 Windows XP 上进行了测试。我使用了 dependency walker 并下载了一堆 .dll,但它仍然无法工作。我设法让所有 dll 都处于“已找到”状态或“红色”状态。

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

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

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

c++ qt qt-creator mingw32
5个回答
10
投票

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

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

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


5
投票

如果您安装了 cygwin,那么您可以运行

ldd <your_app.exe>
并查看应用程序所需的库列表。执行此操作后,将 exe 复制到它所需的另一个文件夹和库。

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


5
投票

您正在部署 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 适合编译器版本也很重要。


3
投票

这是 Qt 中的一个错误。

这是因为缺少 DLL,但它是一个插件 DLL,因此它不会出现在 dependent.exe 中,并且 Qt 不会在应该查找的地方查找它。

长话短说,如果您将 qwindows.dll(或用于调试版本的 qwindowsd.dll)复制到部署计算机上,并放入与它来源相同的绝对路径,即 c:\Qt .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 仅在开发计算机上安装的硬编码绝对路径(即 depends.exe)中查找 qwindows.dll(无论

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"
即可。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.