windows - 为什么 Qt 让开发人员为每个应用程序包含他们的 dll?

标签 windows qt deployment

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

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

我发现它有点“不保守”:我有 7 个使用 Qt5 的应用程序,它们都有 Qt5Core.dllQt5GUI.dll 等,每个应用程序都有其中需要一些空间。感觉我有 7 个 Qt5 库包... x_x

而在 Linux 上,这些相同的应用程序仅使用“一个”Qt 库。

最佳答案

I noticed that deployed on windows Qt applications are always including the dlls they needed.

这称为“本地部署”。

Why did they made it that way?

我可以想到几个原因。

  1. 避免 DLL Hell
  2. 它已获得 Microsoft 的批准。他们写道:“您可以使用此部署方法来允许没有管理员权限的用户进行安装,或者可以从网络共享运行应用程序。”(请参阅​​ https://learn.microsoft.com/en-us/cpp/windows/choosing-a-deployment-method?view=vs-2019 )

You install needed Qt version to system, and then every application that need it - can use it, e.g. only one instance of libraries(excluding different versions like 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 中存在严重错误)

Why can't they do it like on linux? .... on linux these same applications use only "one" Qt library.

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

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

关于windows - 为什么 Qt 让开发人员为每个应用程序包含他们的 dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60596053/

相关文章:

c++ - 是否可以禁用 QComboBox 中的条目

deployment - Robocopy 将文件复制到远程机器

ubuntu - 谁能告诉我tomcat 9中server.xml中的AUTOBIND在哪里,如附件答案中所述

c - 有没有办法在不等待换行的情况下尽快获取文本?

windows - Wix 项目模板在安装后没有出现在 VS2012 中

c++ - 绘画后winapi窗口不刷新

c++ - 如何将Qwt图绘制到图像中

c++ - Frameles 和透明窗口不起作用! Qt 部件

Heroku 预引导翻转时间

python - 使用 python 打印 Excel 工作簿