【问题标题】:Do I have to include all these Qt dlls with my application?我必须在我的应用程序中包含所有这些 Qt dll 吗?
【发布时间】:2013-07-18 03:46:16
【问题描述】:

我在使用 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 上遇到了很多问题,但我找不到任何可以帮助我的问题,所以请不要将此标记为重复,因为如果我找到了明确的回答我不会发布这个问题!


任何帮助将不胜感激。

【问题讨论】:

  • 我也有这个问题。 ICU图书馆很大。我想知道是否可以重新编译它以使其更小。此外,我不在我的应用程序中直接使用 OpenGL,但我需要包含 EGL 和 GLES——也许用一些标志重新编译 Qt 会有所帮助。但现在我必须坚持使用 Qt 4.8。
  • 如果您不需要 qtwebkit,您可以在没有 ICU 支持的情况下重新编译 Qt,然后省略 ICU dll。

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


【解决方案1】:

更新:使用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

单个小EXE

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

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

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

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

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

从技术上讲,在 LGPL 下使用 Qt 时,您可以进行静态链接,即使您的应用程序没有使用 LGPL。唯一棘手的要求是保持第三方能够将您的应用程序重新链接到不同的 Qt 版本。但是您可以轻松地遵守这一点,f.i.通过为您的应用程序提供一个巨大的目标文件 (.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

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

希望对您有所帮助。

【讨论】:

  • 技术上,您在 LGPL 下使用 Qt 时允许静态链接,即使您的应用程序未使用 LGPL。唯一棘手的要求是保持第三方能够针对不同的 Qt 版本重新链接您的应用程序。但是您可以轻松地遵守这一点,f.i.通过为您的应用程序提供一个巨大的目标文件 (.o),只需要链接到任何 Qt 版本。
  • 是的。谢谢你让我诚实@peppe。我会更新我的帖子以反映这一点。
  • 感谢您提供有用的信息。现在我无法静态编译 Qt,所以我坚持使用我发布的解决方案。
  • "更新:使用 windeployqt.exe!它工作得非常好。" - 昨天试过了,效果非常非常糟糕。无法拉入依赖,拉了很多不必要的库。对于 QML 文件,它的表现更糟——几乎无法正确地做任何事情。
  • @dtech 在windeployqt.exe 之前,我会备份我的Qt/ 文件夹中的qt 插件和dll,然后在运行我的发布exe 时,在Qt 文件夹中删除尽可能多的dll。这将使我留下所有当前链接并由我的 exe 使用的文件。这有点费时,但它奏效了。然后你把删除的最终结果放在你的 exe 旁边,你就有了一个包。我还没有在 QML 环境中尝试过。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

      • 一些垃圾 AV 会报告为恶意软件,我不建议这样做
      【解决方案5】:

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

      Qt5Core.dll 
      Qt5Gui.dll 
      Qt5Widgets.dll
      

      在 Windows 中,您还需要文件夹“platforms”中的“qwindows.dll”。 试一试。

      【讨论】:

      • 但是这些 dll 的大小是多少
      • @paulm 在 Qt 5.7 上,大约 16 mb,使用 qwindows.dll 大约 17 mb。
      • 相同的最小 Qt DLL 集足以满足使用 Qt 5.10.0 构建的基本应用程序
      【解决方案6】:

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

      【讨论】:

      • 压缩不是瘦身的解决方案。 Qt 是一个庞大的库,最好的解决方案是将尽可能少的代码链接到您的应用程序中,而不是试图通过压缩文件来节省硬盘空间。它实际上会在运行时解压缩并对程序的性能产生负面影响。
      猜你喜欢
      • 2013-06-04
      • 1970-01-01
      • 2013-11-13
      • 2013-08-21
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多