【问题标题】:Is there any risk in having an exe larger than 100MB built with Delphi?使用 Delphi 构建大于 100MB 的 exe 是否有风险?
【发布时间】:2018-09-05 12:01:09
【问题描述】:

我的 Delphi win32 VCL 应用程序被部署为一个大的 exe。该应用程序是一个客户端服务器应用程序,带有一个连接到 SQL Server 的胖客户端。

这很方便(更新共享文件夹中的一个文件并更新应用程序就足够了——当然数据库架构也会更新)。

由于我在每个版本中都使用了许多“胖”的第三方组件,例如 ReportBuilderDevExpress,因此 exe 文件大小的增长主要是因为这些组件变得越来越大。

在 dpr 中,我设置了这些标志,以确保从共享文件夹或可移动设备启动 exe 时,它​​始终加载到内存中(并避免奇怪的连接错误):

{$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP}
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}

如果 exe 是使用 Release Build Configuration 构建的,则普通 exe 通常会减小大约 50% 的大小(与 Debug Build Configuration 相比)。但是由于我使用的是 EurekaLog,所以使用 Build 而不是 Debug 构建只会稍微减小大小。

目前我的 exe 为 115MB(使用“Build”构建配置和 EurekaLog 构建)。

任何人都可以体验吗?是否存在不宜超过的已知限制?

以下是近年来规模的增长情况:

2014 年:76MB

2015 年:82MB

2016 年:90MB

2017 年:97MB

2018 年:115MB

自从我最近超过了 100MB 的限制后,我开始担心。

我知道可以使用运行时包进行构建,但我的问题集中在尽可能保持单一的大型 exe 方法。

我记得 cnPack 有一个我过去尝试过的 Uses Cleaner 功能。这可能会帮助我删除一些未使用的单元,从而减少 exe 大小,但无论如何这无法阻止让我超过 100MB 的趋势。

谢谢。

【问题讨论】:

  • 运行时包不会改变任何东西。事实上,这只会增加总规模。因为链接器将无法删除未使用的代码。你在压制 RTTI 吗?另外,为什么 100MB 的可执行文件会成为问题?你有任何实际问题吗?我不明白为什么使用像 Eureka log 这样的工具会影响可执行文件的大小。他们是否将地图文件打包到可执行文件中?我使用 madExcept,用于创建堆栈跟踪的信息位于外部文件中。
  • 我在构建过程中使用 UPX,这使得 exe 文件大小约为原始大小的 25%。
  • UPX 可能会让事情变得更糟。更有可能吸引反恶意软件产品的注意,并且您强制在启动时从磁盘读取整个可执行文件,而不是让它按需分页。
  • @who 你有什么收获?我在 UPX 中根本看不到任何好处。也许 20 年前值得,但即使这样也值得怀疑。
  • 一个更稀缺的资源是内存,而 up 需要更多。对于下载大小,您的下载内容将被打包。

标签: delphi exe delphi-10-seattle


【解决方案1】:

您可以使用"Store all names externally" option 将一些调试信息卸载到外部文件,但您的可执行文件将不再是独立的。

【讨论】:

    【解决方案2】:

    我问了 EurekaLog,他们回答:

    你的EXE在EurekaLog处理后的大小主要是确定的 根据您的 MAP 文件的大小。其他影响大小的因素 EXE 包括您选择的 EurekaLog 选项,例如内存检查、 发件人、JCL 支持等。

    您可以通过选择 EL 来稍微减小 EXE 的大小 压缩选项。请记住,压缩会影响启动 时间,因为调试信息需要解压时 启动 EXE。

    您可以通过关闭调试来进一步减小 MAP 文件大小 不需要堆叠的程序部分中的信息 崩溃后的跟踪。像 DevExpress 这样的大型组件库会 是一个好的开始。

    最后,您可能有其他编译器选项,例如打开范围检查 与 EurekaLog 同步开/关。一些编译器选项可以做出贡献 到 EXE 大小。

    您可以使用我们的 EurekaLog PE Analyzer 查看调试详情 信息大小,压缩等。

    所以不知何故,用户 Ville Krumlinde 说调试信息是原因是正确的。因此,要回答这个问题,拥有一个大 exe 没有问题,要减少 exe 大小,必须使用 Release Build Configuration,要使用 Eureka Log,应该尽量减少地图文件的大小,在上面的引用中大多数提示都在那里.

    【讨论】:

    • 简单的解决方案。切换到 madExcept 并拥有更好的功能,无需将地图文件打包到 excitable 中。
    • @DavidHeffernan 兴奋吗? ;-)
    猜你喜欢
    • 2016-07-08
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多