如何在没有安装Qt的情况下运行Qt程序?

8
我使用Qt5.3.1编写了一个程序,并在开发机上成功运行。我将所有必要的.dll文件复制到我的.exe所在的文件夹中,包括:Qt5Widgets.dll、Qt5Network.dll、Qt5Gui.dll、Qt5Core.dll、icudt51.dll、icuin51.dll、icuuc51.dll、libgcc_s_dw2-1.dll、libwinpthread-1.dll和 libstdc++-6.dll。
现在我想在没有Qt安装的机器上运行该程序。有没有办法实现这个目标呢?用户不需要安装IDE才能使用程序,对吧?
开发机的详细信息如下:
- Windows 8 - Qt 5.3.1
部署平台为:
- Windows Vista - 没有Qt安装但所有必要的.dll文件都已准备好
我收到的错误消息首先是: > This application failed to start because it could not find or load the Qt platform plugin "windows". Reinstalling the application may fix this problem.
接下来是: > This application requested the Runtime to terminate in an unusual way. Please contact support.
然后程序崩溃了。但是如果我安装Qt5.3.1,则可以正常工作。因此,这与`c:/Qt`目录中的文件有关。

1
此外,Qt网站上也有官方指南可供参考。 - JBentley
我知道并且我已经谷歌过了,但是指南假设Qt已经安装好了,而这正是我的问题所在。对于糟糕的描述我很抱歉,我已经修改过了。 - D4rth B4n3
感谢您的编辑。我撤销了我的反对票。如果您在该页面向下滚动到标题为“创建应用程序包”的部分,它包含了在没有安装Qt的机器上部署的说明。特别是要注意关于插件的部分,因为这与您的错误消息有关。我自己使用这些说明来部署Qt应用程序,并确认它们有效。 - JBentley
可能是 https://dev59.com/7nNA5IYBdhLWcg3wUMDn 的重复问题。 - László Papp
此答案图形化地说明了您需要做什么。别忘了也要安装 MSVC 可再发行软件包! - Kuba hasn't forgotten Monica
8个回答

8
短答案是,您需要进行静态构建,或者需要重新分发Qt共享库DLL。如果您想要更小的文件大小,则通常情况下静态构建更好,但是如果您在LGPL许可证下使用Qt5,则可能会涉及法律问题。我不是律师,但您可以在LGPL第4.1节中了解有关LGPL链接规则的信息。
长答案是,您应该阅读一般Qt5部署指南Qt5 Windows部署指南。这些详细介绍了相关内容。

1
注意:LGPL第4(d)(0)条款并不总是被理解为您必须分发所有源代码才能进行静态链接。您只需要提供用户重新链接到库的新版本或不同版本的能力即可。这可以通过不同的方式实现,例如提供已编译的目标文件以便用户重新链接,或创建一个动态包装库并将Qt静态链接到其中,然后发布您的包装器的源代码。话虽如此,使用Qt进行静态链接并不容易,并且似乎得到的支持很少。 - JBentley

8

此应用程序无法启动,因为它找不到或加载Qt平台插件“windows”。

对于这个问题,您应该将插件{QTSDK}/plugins/platforms/qwindows.dll复制到{YOUR_EXE_DIR}/platforms/qwindows.dll


我已经将错误信息更改为: libwinpthread-1.dll 要么不适用于 Windows,要么包含错误。请尝试使用原始安装媒体重新安装程序或联系支持。 - D4rth B4n3
我也遇到了同样的问题,并在windeployqt.exe创建的其他DLL上看到了类似的错误消息。对于任何其他遇到此问题的人,我能够手动从Qt bin文件夹(例如C:\ Qt5.3.0 \ 5.3 \ mingw482_32 \ bin)复制有问题的dll,然后生成的文件夹就可以正常运行了。 - Tod

3

我也遇到了这个问题,

在你的Qt目录下,使用正确的Qt版本 C:\Qt\Qt5.2.1\5.2.1\mingw48_32\plugins\platforms\

将 qwindows.dll 复制到与您的可执行文件相邻的新文件夹中,以使您的列表如下:

  • Qt5Widgets.dll
  • Qt5Network.dll
  • Qt5Gui.dll
  • Qt5Core.dll
  • icudt51.dll
  • icuin51.dll
  • icuuc51.dll
  • libgcc_s_dw2-1.dll
  • libwinpthread-1.dll
  • libstdc++-6.dll
  • platforms/qwindows.dll

3
更好的解决方案是使用Qt SDK应用程序“windeployqt”。它会根据目标平台将所有所需的dll和插件复制到应用程序文件夹中,然后您就可以在另一台计算机上运行该应用程序。这里是文档:https://doc.qt.io/Qt-5/windows-deployment.html
例如,如果您的可执行文件是使用mingw53_32构建的,并且可执行文件位于“C:\example_qtapp”中:
QT_INSTALL_DIR\minqw53_32\bin\windeployqt.exe c:\example_qtapp

注意:我有一个人在使用以下内容时遇到了dll缺失错误,我不得不手动将它们从我的计算机复制到c:\example_qtapp文件夹中:libgcc_s_dw2-1.dll、libstdc++-6.dll和libwinpthread-1.dll。 - JimSan
谢谢你的回答 - 我已经使用Qt两年了,但是如果我想在我的电脑之外使用它,我总是不得不在Linux上使用MXE编译它,而且我从来没有听说过这个工具。 - Altinsystems

1

您应将 Qt DLL 文件与您的可执行文件一起放置在发布版本中。 这些文件包括 Qt5Core.dllQt5Gui.dll 和可能用到的其他模块的 dll 文件。这些 dll 文件在您安装的 Qt 目录中的 bin 文件夹中。如果使用 MinGW,您还应该将 LIBGCC_S_DW2-1.DLLMINGWM10.DLLLIBSTDC++-6.dll 放置在其中。

如果使用插件,则应将其 dll 文件放置在名为 plugins 的文件夹旁边的 exe 中。 如果使用图标和图像,则应将其 dll 文件(例如 qico.dllqsvg.dll)放在名为 imageformats 的文件夹中。


0
你还应该将 {QTSDK}/plugins 复制到可执行文件所在的目录中。然后在相同的位置(与可执行文件一起)创建名为 qt.conf 的文件,并填充以下内容:
[Paths]
Plugins=plugins

然后,运行你的程序。我在Linux上也做了同样的事情。


0

如果Qt dll文件存在,那么它应该可以工作。我猜测你缺少了IDE的运行时库/ dll文件。例如,如果您使用Visual Studio 2010作为IDE,则需要安装VS2010 Redistributable x86 / x64 link,具体取决于您的架构。


0
在您的应用程序文件夹中,按住SHIFT键并从鼠标右键单击。您将看到 - 打开命令窗口此处。
  1. 单击打开命令窗口
  2. 键入windeployqt.exe app_name.exe --parameters并按ENTER键

示例:

windeployqt.exe APP_NAME.EXE --release --no-translations --no-system-d3d-compiler --no-compiler-runtime --no-angle --no-opengl-sw

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