【问题标题】:Why does building with runtime packages make the EXE file smaller?为什么使用运行时包构建会使 EXE 文件变小?
【发布时间】:2010-12-26 07:04:24
【问题描述】:

我有一个关于 Delphi 中使用或不使用运行时包(Project->Option->Packages)构建选项的问题。
与取消选中该框(3,521KB)相比,当我选中“使用运行时包构建”框时,可执行文件的大小似乎更小(389KB)。为什么会这样?

我在为它构建安装盘时遇到了很多麻烦,无法弄清楚安装中应该包含哪些文件。我想知道这是否与它有关,但我已经尝试了这两种选择。

【问题讨论】:

  • 我也很好奇这个。我使用 EurekaLog,除非您在没有运行时包的情况下构建,否则它的内存泄漏能力不起作用。所以我花了几天时间消除了对它的需要。因此,为了补充您的问题,我也很好奇为调试构建构建 WITH 运行时包是否值得构建,而对于发布构建则不值得构建,如果是,如何做到这一点?

标签: delphi installation packages


【解决方案1】:

当您使用运行时包进行构建时,VCL 和 RTL 会从包中加载,因此它们的代码不必链接到您的 EXE 中。所以 EXE 变小了,但总安装量变大了,因为你不能使用智能链接来减小包的大小。

正如您已经注意到的,使用包会导致内存泄漏跟踪问题,也会导致调试问题。通常只有在您使用还需要运行时包的插件时才值得使用它们。

【讨论】:

  • 如果您要在一台机器上运行许多不同的应用程序,这些应用程序都使用 VCL,这也是有益的——多次将其加载到内存中是没有意义的。
  • +1 即使在插件可能需要它们的情况下,您也最好将它们设计为不需要运行时包。因为当您在较新的 Delphi 版本中构建应用程序时,这些插件都会被破坏,因此:您永远无法升级到较新的工具,插件作者也无法升级。
  • 除了在大多数 PC 上使用千兆字节的 RAM 之外,版本问题带来的麻烦以及可能从我的路径中的某处加载错误的 BPL 的想法(DLL 地狱 == BPL 地狱)保留了很多人们从未想在实践中使用这种技术。如果可以信任 BPL 仅在本地加载并忽略系统 PATH 环境,那么完全“并行”运行的能力将会非常棒。
【解决方案2】:

不知道 D2010,但在 D2006 中,项目菜单中有一个选项,名为“ProjectName 的信息”。

这将显示编译后包含哪些包。

然而,正如 Mason 所说,使用运行时包没有什么好处,也有不少缺点。

【讨论】:

    【解决方案3】:

    到目前为止的答案忽略了一个关键点:运行时包的用处与 DLL 的用处相同,如果您有一套可以一起工作并一起安装的应用程序。您当然可以通过在没有包的情况下构建它们来将 VCL 和第三方库链接到所有这些库中,但是根据应用程序和使用的库的数量,这些应用程序的总大小将大于使用运行时包构建的它们的大小加上这些运行时包的大小。这将产生更大的安装包,这已经不是以前的大问题了。

    但同时使用所有这些应用程序也会为系统带来更高的负载。由于每个应用程序都使用自己的 VCL 副本和其他库,所有这些都需要从磁盘加载到内存中,这会导致更多的 I/O。然后在内存中会有几个副本,每个都占用代码空间。当使用运行时包时,每个应用程序都有自己的数据存储区域,但它们都将共享内存中包代码的相同副本。

    对于没有任何特殊需求的单个自包含应用程序,一定要在没有包的情况下构建。

    【讨论】:

    • 典型的 4GB 内存被填满了多少?无论如何,它仍然适用,因为缓存也是内存,而且相当昂贵。不过,我认为这更像是一个理论案例,因为并非 RTL/VCL 的所有页面都将处于活动状态。
    • 好吧,称我为老式,但拥有足够的内存并不是浪费它的充分理由。这种想法给我们带来了今天软件的糟糕状态。与我的第一台 PC 相比,我现在的机器有 4000 倍的 RAM 和 20000 倍的硬盘空间,但感觉所有这些额外资源中的大部分都被浪费了......
    • 我原本是化学系的,测量和量级的感觉是无可替代的。这种感觉比下意识的“浪费”反应更强烈。
    • 您在这里提供的是通过失去稳定性、向后/向前兼容性和通过增加复杂性和无数的相互依赖问题。 BPL 对于 IDE 来说是可以的,因为它已经存在只能与一个 RTL/VCTL/编译器一起工作的限制。不要对您的应用这样做。
    • 不,我在这里提供的是一些技术背景信息。我不建议为多个应用程序使用包(这不是仅关于插件),我只是认为应该对包有足够的了解才能做出明智的决定。每个开发人员都需要在权衡利弊后做出自己的决定。是的,到目前为止,我一直决定不使用包。但是像“无数相互依赖的问题”这样的陈述只不过是夸张而已。
    【解决方案4】:

    使用运行时软件包的主要原因之一是当您需要模块粒度来在不接受大文件的介质上部署/更新时,例如通过低带宽的线路。

    因为在您更改 Delphi 版本之前,运行时包保持不变 - 就像那些仍在 D7 上的永远一样 ;-) - 它允许在没有 RTL/VCL 负载的情况下部署新版本或新应用程序。

    但与 DLL 一样,您必须小心版本控制。

    【讨论】:

    • 这是否意味着如果我“使用运行时包构建”那么我必须单独运送这些包?对不起,如果这是一个愚蠢的问题。
    • 您必须将软件包与您的应用程序一起提供 - 安装时要非常小心,不要覆盖较新的版本(更新包也可能会更新)。建议使用能够正确检查版本的良好安装程序。
    • snackmoore,大多数 Delphi 开发人员永远不会在交付给客户的最终构建中使用运行时包进行构建,除非他们也想让自己的工作变得更加困难。 BPL 包只会让你的生活变得更难,除非你真的出于某种原因需要它们(其他答案告诉你为什么你可能需要它们),那么你就不需要它了,所以就这样吧。
    【解决方案5】:

    关于您的问题“安装中应包含哪些文件”:您可以使用Dependency Walker 跟踪库依赖项。

    【讨论】:

      猜你喜欢
      • 2023-01-26
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      相关资源
      最近更新 更多