【发布时间】:2013-06-30 10:27:22
【问题描述】:
我在windows上做了一个qt程序。 我想和我的朋友分享。 但我的朋友使用的是纯 Windows 7。
如果我可以只包含所需的 dll,那就太好了。 如果我可以删除部分未使用的dll,那就更好了。 (以减小 dll 的大小)
我该怎么做?谢谢
【问题讨论】:
-
你能说得更具体点吗?
我在windows上做了一个qt程序。 我想和我的朋友分享。 但我的朋友使用的是纯 Windows 7。
如果我可以只包含所需的 dll,那就太好了。 如果我可以删除部分未使用的dll,那就更好了。 (以减小 dll 的大小)
我该怎么做?谢谢
【问题讨论】:
试图以任何方式减小实际 DLL 的大小意味着删除代码,这是一个非常糟糕的主意。您仍然可以更改 Qt 源代码:
...话虽这么说,但在您的特定情况下,这不是要走的路。
尝试减少所需 DLL 的数量是另一回事 - 您的应用程序通常只需要它需要的模块的 DLL。但是有些模块依赖于其他模块,因此您最终可能会为您自己不使用但在内部某处使用的东西获得 DLL。例如,您可能最终依赖于基于 QWidget 的项目的 Direct3D DLL,这是因为许多库存 Qt 构建都是使用 ANGLE 构建的,它是基于 DirectX 的 OpenGL 仿真层(ES ) 2. 您可以使用用于桌面 OpenGL 的 Qt 构建来删除一些 DLL,但与 Qt DLL 相比,它们相当小。从 Qt 中省略 webkit 是删除几 MB DLL 依赖项的好方法。
peppe 已经提到了最后一个选项 - 静态链接,它要求您对 Qt 本身进行静态构建。并且有一些限制 - 如果您想分发封闭源代码/商业应用程序,您必须拥有该特定平台的商业 Qt 许可证。对于开源的东西和测试目的,我想这没问题。静态构建非常好,因为它们提供了更好的性能,并且您最终会得到一个大约 8-9 MB 的基本 GUI 应用程序(QtCore/QtGUI 和 QtWidgets)的文件。上次我检查时,QtQuick/QML 应用程序不适用于静态构建。
【讨论】:
最简单的方法是使用 Qt 的静态发布版本,并启用链接时间优化。为此,您需要 MSVC(不知道它是否适用于 MinGW 的 GCC),并配置 Qt 与
configure -static -release -ltcg
当然,在使用 (L)GPL 版本的 Qt 时,还要注意静态链接的含义。
通常,您可以通过功能开关来修剪 Qt 的某些部分。 Unix 配置脚本通过传递-no-feature-featurename 直接支持这一点,其中featurename 是src/corelib/global/qfeatures.txt 文件中列出的功能之一。
可能有一种方法可以使用 Windows 配置可执行文件(最终,将相应的 QT_NO_FEATURE 宏添加到生成的 src/corelib/global/qconfig.h 文件中......)。
请注意,功能开关不受官方支持(“尽力而为”支持),因此禁用 Qt 的某些部分可能会破坏您的构建。 YMMV。
【讨论】: