我已将项目从 RAD Studio 2010 升级到 RAD Studio XE4。该项目主要是 C++,使用 RAD Studio 的 C++ Builder 的一半,以及少量的 Delphi。
在 2010 年,发布版本为 22MB。在 XE4 下,相同的 Release 版本是 55MB。
这是一个问题,因为:
- 55MB 对于 EXE 来说非常大
- 启动程序花费的时间明显更长(不多,但有些。)
- 我们的许多客户在海上时从偏远地区或船上下载新版本。大小事项。
什么可能导致这种情况,我该如何解决?
笔记
- 奇怪的是,调试版本仍然只有 23MB。项目设置看起来非常相似。我对选项集的导出进行了比较,只看到
<UsePackages>True</UsePackages>
了 Release 而不是 Debug 中存在的东西;删除它没有任何区别。除此之外,还有代码优化开启并且缺乏_DEBUG
定义。 - 为发布版本生成调试信息,但进入外部 .tds 文件。(这将在未来用于 EurekaLog,目前允许我们调试程序的发布版本。)我想知道链接器是否在调试信息中链接,但据我所知,C++ 链接器总是将调试信息放在存在的外部文件,加上构建中尚未启用 EurekaLog。
- 项目文件 (.cbproj) 是在 XE4 中创建的,不是从旧的 2010 升级的。我创建了新项目并添加了旧的 .cpp 和 .pas 文件。这是为了避免升级引起的问题 - 在 Embarcadero 论坛上,通常建议在升级 IDE 版本时重新创建项目。在这之前,我遇到的问题确实比 2010 年少。
- 很多人提到 Delphi XE2+ EXE 明显比旧版本的 Delphi 生成的要大。( 1 , 2 , 3 , 4 , 5 , 6。) 虽然 C++ 链接器与 Delphi 使用的不同,但原因可能是相似的。
原因似乎主要是 Delphi RTL 代码使用的 RTTI,在 Delphi 项目中可以通过指定{$WEAKLINKRTTI ON}
. XE4文档没有提到等效的 C++ 链接器 pragma。有#pragma explicit_rtti
(C++ 的类似物{$RTTI}
)和__declspec(delphirtti)
(C++ 的类似物{$M}/{$TYPEINFO}
)。 - 该项目使用运行时包和动态 RTL 链接。它是一个 32 位的 VCL 表单应用程序。我在 Windows 7 上安装了 XE4 Update 1。
- 编辑: David Heffernan在下面的评论中询问每个项目的 .map 文件大小。
发布的 .map 大小为 17MB,.tds 大小为 80MB。
Debug 现在已经停止链接,链接器报告它内存不足(一个旧的、旧的错误,应该在几年前修复。)没有生成 .map 或 .tds 文件,所以我无法给出比较大小准确。从内存中 .tds 大约是 100MB,不幸的是我不记得 .map 的大小了。如果我得到项目链接,我将更新问题。 - 再次编辑:我找到了答案(排序) - 关闭“扩展内联函数”会将 EXE 大小减小到预期值。不过,这本身就令人费解-请参阅下面的答案。请注意,调试版本已关闭此功能,但仍无法链接,从而出现内存不足错误。
我还没有将我的答案标记为正确,以防有人可以提供一些关于正在发生的事情的见解,这将是一个比“关闭此选项”更好的答案。