C++、Qt - 如何摆脱 dll 依赖项?

Posted

技术标签:

【中文标题】C++、Qt - 如何摆脱 dll 依赖项?【英文标题】:C++, Qt - How do I get rid of dll dependencies? 【发布时间】:2010-06-05 17:04:45 【问题描述】:

我已经编译了我的 Qt 应用程序,现在有以下问题 - 现在我构建的项目需要 QtCore4.dllQtGui4.dll 位于 .exe 文件所在的同一文件夹中。 (我使用带有 Qt 插件的 MSVS2008 构建了我的项目)

问:

有什么方法可以将我的最终应用程序与这些.dll 文件结合起来,以便它们生成一个大的.exe 文件? (我只是不想在我的发行版中包含另一堆 dll 文件 - 应用程序)

谢谢。

【问题讨论】:

仅供参考,如果你这样做,你的 exe 会变得很大。 它不会大于当前 exe 和 dll 的总和。可能更小。 【参考方案1】:

您需要静态build 和link to Qt。

编辑:这是至少指向similar information 的更新链接。

【讨论】:

请注意,静态链接 LGPL 版本的 Qt 是一个灰色区域(别忘了您需要先构建 Qt 的静态版本。) @Rob:如果您有疑问,可以联系licensing@fsf.org 或qt 开发人员,询问他们有关静态链接的问题。不过,动态链接是最安全的许可选择。 没有什么“灰色”的:静态链接一个 LGPL 库会绑定你发布你的源代码。 杰瑞,请编辑您的链接以使用/latest/ 而不是/4.2/。 Qt 4.2 已经很多年了。 @Lucas:静态链接到 LGPL 库不会绑定您发布源代码。它要求您发布(编译的)目标文件,以便它们可以与该 LGPL 库的较新版本重新链接【参考方案2】:

将它们打包成一个自解压的 .exe(例如使用 7zip),将所有文件解压到一个临时目录,运行程序,然后在程序退出后删除文件。

与之前建议的静态链接 Qt 相比,这将更容易、耗时更少且法律约束更少。

【讨论】:

【参考方案3】:

当然,您可以以某种方式静态链接。但是使用 DLL 的目的应该是使程序更小(在磁盘和内存中,如果其他应用程序当然正在使用 Qt 库)...... 诸如那些的 DLL 应该是系统范围的,以便其他需要它们的应用程序可以使用它们。基本上,您必须对希望您的程序运行的人说安装 Qt 框架。

另一种方式的部署说明here,阅读静态链接相关部分。

【讨论】:

鉴于当前的硬盘价格,以及由于 DLL 版本冲突而可能(并且确实)出现的困难,这并不是一个好主意。 ops 它与 Coffin 已经给出的链接相同,但从介绍中... @SinTakezou:感谢您指出我的错误——我已经修复了链接。 @Coffin,多么奇怪的世界;对我来说,这几乎就像是说一个程序应该附带适合运行它的整个操作系统......(这也是为什么在某些情况下使用“第三方”非轻量级框架不是我的首选)。上下文当然决定了在询问者情况下什么更好(如果是为了工作,静态链接的解决方案更好,但我不会称之为进步) @ShinTakezou,我猜您从未尝试在 Windows 上部署使用 Visual Studio C++ 构建的应用程序,C++ 的运行时不位于系统上,必须静态链接或通过安装程序

以上是关于C++、Qt - 如何摆脱 dll 依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式列出 C++ 或 Python 中的 DLL 依赖项?

如何以编程方式在C ++或Python中列出DLL的依赖项?

如何在没有依赖关系的 Windows 中构建 Qt-5 应用程序

如何判断一个 exe 是不是依赖于某些 Qt 图像格式的 dll?

C++ dll 与其他 dll 作为依赖项 (SDL2)

Windows C++:编译 DLL 时是不是可以“烘焙”Windows DLL 依赖项? [复制]