9

我的 exe 在我编写它的计算机上运行良好。它调试得很好,发布得很好,我可以将 exe 文件从“发布”文件夹移动到一个新文件中,从 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 32 位。

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

4

5 回答 5

10

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

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

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

于 2013-06-29T07:16:46.787 回答
5

如果您安装了 cygwin,那么您可以运行ldd <your_app.exe>并查看应用程序所需的库列表。这样做之后,将您的 exe 复制到它所需的另一个文件夹和库中。

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

于 2013-06-29T12:37:17.130 回答
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 适合编译器版本也很重要。

于 2013-10-02T12:12:08.203 回答
3

这是 Qt 中的一个错误。

这是因为缺少 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

于 2013-10-08T14:24:57.723 回答
0

这是 Windows 上的错误:

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

具体来说,Qt 仅在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"上面。

于 2013-11-26T10:24:41.897 回答