36

我对使用 Qt 完全陌生,而且我不知道很多东西。

作为测试,我使用Visual Studio 2012和基于最新Qt5.1的 Qt-VS-Add-in 创建了一个简单的应用程序

在我编译应用程序后它对我不起作用(出现错误),我在整个互联网上搜索,发现很多人说我必须从目录中复制下面提到的那些 dll:

C:\Qt\Qt5.1.0\5.1.0\msvc2012\bin\

我必须复制 DLL 才能使我的应用程序工作:

icudt51.dll
icuin51.dll
icuuc51.dll
libEGL.dll
libGLESv2.dll
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll

我的问题是这些 dll 的大小,它们大约是“37 MB”,而我的应用程序本身只有“30 KB”!因此,这些 Qt 库将为我的应用程序添加至少 37 MB [我没有看到它发生在我下载的其他基于 Qt 的应用程序中]。有没有什么解决方案可以让我得到一个小的 .exe 文件?!


而且我听到有人说我还必须包含一个用于 Microsoft C++ 编译器的 dll,你能为我解释一下吗?


注意:我在 StackOverFlow 上遇到了很多问题,但我找不到任何可以帮助我的东西,所以请不要将此标记为重复,因为如果我找到了明确的答案,我不会发布这个问题!


任何帮助,将不胜感激。

4

6 回答 6

29

更新:使用windeployqt.exe!它真的很好用。

http://doc.qt.io/qt-5/windows-deployment.html#the-windows-deployment-tool

使用 windeployqt 的最简单方法是将 Qt 安装的 bin 目录(例如 )添加到 PATH 变量中,然后运行:

windeployqt <path-to-app-binary>

更新:经过进一步测试,windeployqt没有为我复制所有的 MingW dll。(在带有 MingW 4.9.1 的 Windows 10 上使用 Qt 5.4 进行了测试)。所以需要在部署前手动获取最后3个dll:

libgcc_s_dw2-1.dll
libstdc++-6.dll
libwinpthread-1.dll

C:\Qt\5.4\mingw491_32\bin

我认为您的列表中可能还有一些额外内容...我会仔细检查以下链接中的文档...

这是关于它的权威文档:

http://doc.qt.io/qt-5/windows-deployment.html

http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies

Qt DLL 的大小

令人惊叹的 Qt 库可以做很多事情,但它们有点大。一些旧版本的 Qt 可能会小一些。

对于 Qt 4.8,msvcQtCore4.dll为 2.5 MB,QtGui4.dll为 8.4 MB。

Windows 如何解析共享库/动态链接库 (DLL)

以下是 Windows 在运行时跟踪库的方式:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx

单个小EXE

如果您静态链接,那么您的 EXE 应该获取它需要的库并构建到一个独立的 exe 中。它仍然可能依赖于 msvc 可再发行组件。有关它的更多信息,请参阅下一节。但它现在将.lib您引用的 s 编译到您的 EXE 中,并且您的 exe 不再指向其他动态链接库。设置静态链接的 exe 环境确实需要更多时间。

您的 exe 肯定会变得更大,因为它现在包含您之前引用的库的二进制信息。

https://www.google.com/search?q=qt+static+linking

编辑:静态构建 exe,意味着您没有使用 LGPL 版本。 意味着如果您使用 LGPL,您必须让最终用户易于访问您的目标文件。

我认为@peppe 描述得很好(见下面的评论):

从技术上讲,在 LGPL 下使用 Qt 时允许静态链接,即使您的应用程序没有使用 LGPL。唯一棘手的要求是保持第三方能够将您的应用程序重新链接到不同的 Qt 版本。但是您可以通过提供应用程序的巨大目标文件 (.o) 轻松地遵守这一点,只需将其链接到任何 Qt 版本即可。

http://blog.qt.io/blog/2009/11/30/qt-making-the-right-licensing-decision/

查看底部附近的图表。如果你在做商业版,那么你可以静态链接,而不用担心目标文件。

MSVC 可再发行组件

可再发行依赖项与运行时库链接器选项有关。

http://msdn.microsoft.com/en-us/library/aa278396(v=vs.60).aspx

/MD, /ML, /MT, /LD (使用运行时库)

要在开发环境中找到这些选项,请单击“项目”菜单上的“设置”。然后单击 C/C++ 选项卡,然后单击类别框中的代码生成。请参阅使用运行时库下拉框。

下面这两个链接讨论了一些旧版本的 Visual Studio,但推理应该仍然成立。

http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

如何使用 Visual Studio Express 2005 制作完全静态链接的 .exe?

希望有帮助。

于 2013-07-19T01:23:04.427 回答
9

只需打开您的终端执行your_qt_installpath/version/compiler/bin/windeployqt.exe YourApplication.exe。它会自动将所有必需的库和内容复制到您的 exe 所在的文件夹中,您可以分发它。

于 2014-04-04T08:40:01.980 回答
1

I found another workaround without recompiling Qt again!

[ This solution may affect application execution time ]

  • First we need to use UPX to compress each one of Qt Libraries required by our application, they're often the dll's mentioned in the question. However, avoid compressing them too much because you'll notice that your application takes longer time to run.
  • [ Optional ]: If your application binary is large, you may find it useful to compress it using UPX.
  • After compressing all binaries, we want to get a single .exe file, so we can use

    Enigma Virtual Box [ http://enigmaprotector.com/en/downloads.html ] to merge all .dll files with the main executable and we'll end up with a single tiny .exe file!

I'll just do it like this for now since I'm not able to recompile Qt with my own configurations on my current machine.

于 2013-07-24T19:47:37.110 回答
1

对于 Windows,您需要包含qminimal.dllqwindows.dll,您必须将它们放在名为platforms.

即使你的程序很小,你仍然调用巨大的库来做图形界面。如果大小真的很重要,你应该做一个控制台项目。

PS:您可以通过使用dependency walker打开您的exe 来检查您真正需要的所有库。

于 2013-07-19T01:31:24.013 回答
1

在我看来,Qt5.2需要更少的 dll。

Qt5Core.dll 
Qt5Gui.dll 
Qt5Widgets.dll

在 Windows 中,您还需要文件夹“平台”中的“qwindows.dll”。试试看。

于 2014-03-17T08:15:33.767 回答
1

如 Alaa Alrufaie 所述,减小 DLL 大小的一种可能性是使用 UPX 压缩它们。另一种方法是将其包装到安装程序中(例如 Inno Setup)。如果您想将其分发给最终用户,则后者特别有用)。我有一个简单的应用程序,需要 Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll 和 qwindows.dll(在“平台”文件夹中)占用大约 17 MB。创建安装文件后,它缩小到 5 MB。

于 2016-09-18T08:59:32.043 回答