为啥 Qt 让开发人员在每个应用程序中都包含他们的 dll?

Posted

技术标签:

【中文标题】为啥 Qt 让开发人员在每个应用程序中都包含他们的 dll?【英文标题】:Why Qt is making developers to include their dlls for every application?为什么 Qt 让开发人员在每个应用程序中都包含他们的 dll? 【发布时间】:2020-03-09 07:12:32 【问题描述】:

我注意到部署在 Windows 上的 Qt 应用程序总是包含他们需要的 dll。 他们为什么这样做? 为什么他们不能像在 linux 上那样做呢? - 您将所需的 Qt 版本安装到系统,然后每个需要它的应用程序 - 都可以使用它,例如只有一个库实例(不包括 qt4/qt5 等不同版本)。

把它做成像 Java/.Net 这样不是更好吗?您安装 Java/.Net,然后仅使用一个库 (dll) 实例运行/开发应用程序。

我觉得它有点“不守恒”:我有 7 个使用 Qt5 的应用程序,它们都有Qt5Core.dllQt5GUI.dll 等,每个都占用一些空间。感觉我有 7 包 Qt5 库... x_x

虽然在 linux 上,这些相同的应用程序只使用“一个”Qt 库。

【问题讨论】:

Windows 的理念更多是独立于其他程序的问题。集中化的问题是,一个错误会破坏使用该 DLL 的每个程序。所以宁愿在大硬盘上多使用几个字节。 @falkb Qt 不是框架吗?那么为什么它不能安装,后来用作Java/.Net(当它没有安装时)例如? the problem that a bug tears down every program which uses that DLL:好吧,如果框架有问题,那么它如何在 linux 上正常工作? The philosophy on Windows is more to be independent from problems of other programs 但它是一个框架,为什么每次都要包含它...?如果框架有问题,那是框架的问题,而不是应用程序本身的问题。 你很幸运。如果您有针对不同版本的 Qt(4.x、3.x、5.x)构建的应用程序怎么办?您将如何通过为所有应用程序安装一个 Qt 来解决它? 对用户计算机的部署不受 Qt 公司控制,而是由您,即软件的提供者控制,因此,如果您有一堆应用程序,没有什么可以阻止您安装共享组件,例如Qt DLL。我经常说,开发人员希望控制部署的所有方面,例如使用的确切 Qt 版本(因为它已经过测试),而不是“注入”一些可能导致回归的升级。 @BladeMight:想象一家公司投入数月时间来测试他们的版本。他们不想冒险发布不稳定的版本,因为有人更改了位于外部的 Qt.dll,他们不想交出控制权。 【参考方案1】:

我注意到部署在 Windows 上的 Qt 应用程序总是包含他们需要的 dll。

这称为“本地部署”。

他们为什么这样做?

我能想到几个原因。

    为了避免DLL Hell。 它得到了微软的认可。他们写道,“您可以使用这种部署方法来启用没有管理员权限的用户进行安装,或者用于可以从网络共享运行的应用程序。”(参见https://docs.microsoft.com/en-us/cpp/windows/choosing-a-deployment-method?view=vs-2019)

您将所需的 Qt 版本安装到系统,然后每个需要它的应用程序 - 都可以使用它,例如只有一个库实例(不包括qt4/qt5等不同版本)

Qt 是一个 C++ 库。 C++ DLL 的区别不仅仅在于主要版本号。 DLL 可以用 MinGW 构建,也可以用 MSVC 构建;它们可以是 32 位的,也可以是 64 位的。不同的变体互不兼容。

示例:如果您强制一台 PC 拥有一个 Qt 5.14.1 MSVC 32 位的全局副本并将其放入您的 PATH,那么:

该 PC 上使用 MinGW 构建的其他 Qt 应用程序无法运行。 该 PC 上的其他 64 位 Qt 应用程序无法运行。 必须使用 Qt 5.13 的应用程序可能会损坏。 (例如,如果 Qt 5.14 中存在严重错误)

为什么他们不能像在 linux 上那样做呢? .... 在 linux 上,这些相同的应用程序只使用“一个”Qt 库。

我在上面列出了这种方法的一些缺点。此外,Linux 发行版中的 Qt 版本通常落后几个版本,因此发行版存储库中的应用程序无法使用最新的功能、错误修复或改进。

这就是发明像AppImage and Snapcraft 这样的系统的部分原因。有时,Linux 用户还希望应用包含其库的副本,而不是拥有库的单个全局副本。

【讨论】:

好的答案 - 我要补充的另一点是它使开发人员只需分发二进制文件的子集。一个完整的 Qt 发行版有几百兆字节。一个典型的应用程序可能只需要该功能的一小部分。 嗯,这是有道理的,谢谢你的回答@JKSH

以上是关于为啥 Qt 让开发人员在每个应用程序中都包含他们的 dll?的主要内容,如果未能解决你的问题,请参考以下文章

由他们自己的开发人员在 Docker 容器中进行故障排除

测试人员与开发人员干起来了?教你几点让他们相见恨晚

高分求qt写的线程程序,功能每隔一百毫秒查询数据,这个线程在整个程序运行中都一直在运行

每个前端程序员都应该知道的10个Chrome扩展

如何让 QT 应用程序写入崩溃日志

为啥我需要 GCM 或 APN?