我是否必须将所有这些Qt dll包含在我的应用程序中?

时间:2013-07-19 00:26:46

标签: c++ qt visual-studio-2012 qt5

我是使用Qt的新手,我不知道很多东西。

作为测试,我使用基于最新 Qt5.1 Visual Studio 2012 和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上遇到了很多问题,但我找不到任何可以帮助我的东西,所以请不要将此标记为重复,因为如果我找到了清楚的话回答我不会发布这个问题!


任何帮助都将不胜感激。

6 个答案:

答案 0 :(得分:25)

更新:使用windeployqt.exe!它的效果非常好。

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

  

使用windeployqt的最简单方法是添加bin目录   你的Qt安装(例如)到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,msvc QtCore4.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

Single Small EXE

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

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

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

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

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

  

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

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

查看底部附近的图表。如果您正在使用商业版本,那么您可以静态链接,而无需担心目标文件。

MSVC Redistributables

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

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

How do I make a fully statically linked .exe with Visual Studio Express 2005?

希望有所帮助。

答案 1 :(得分:7)

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

答案 2 :(得分:1)

对于Windows,您需要添加qminimal.dllqwindows.dll,您必须将它们放在名为platforms的文件夹中。

即使您的程序很小,您仍然会调用大型库来执行图形界面。如果大小非常重要,你应该做一个控制台项目。

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

答案 3 :(得分:1)

我找到了另一种解决方法而无需再次重新编译Qt!

[此解决方案可能会影响应用程序执行时间]

  • 首先,我们需要使用UPX来压缩我们的应用程序所需的每个Qt库,它们通常是问题中提到的dll。但是,请避免过度压缩它们,因为您会注意到应用程序需要更长的时间才能运行。
  • [可选]:如果您的应用程序二进制文件很大,您可能会发现使用UPX压缩它很有用。
  • 压缩所有二进制文件后,我们想获得一个.exe文件,所以我们可以使用

    Enigma Virtual Box [http://enigmaprotector.com/en/downloads.html]将所有.dll文件与主可执行文件合并,我们最终会得到一个小的.exe文件!

我现在就这样做,因为我无法在当前机器上使用我自己的配置重新编译Qt。

答案 4 :(得分:1)

我认为 Qt5.2 需要更少的dll。

Qt5Core.dll 
Qt5Gui.dll 
Qt5Widgets.dll
在Windows中

你还需要在“平台”文件夹中使用“qwindows.dll”。 试一试。

答案 5 :(得分:1)

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