9

我已将项目从 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 大小减小到预期值。不过,这本身就令人费解-请参阅下面的答案。请注意,调试版本已关闭此功能,但仍无法链接,从而出现内存不足错误。
    我还没有将我的答案标记为正确,以防有人可以提供一些关于正在发生的事情的见解,这将是一个比“关闭此选项”更好的答案。
4

1 回答 1

8

解决了(有点)

发布版本打开了“扩展内联函数”。关闭此功能可将 EXE 大小从 55MB 减少到 17MB。

显示 C++ 编译器 - 调试部分中的“扩展内联函数”选项的项目选项

这是一个惊人的差异,我不知道为什么差异如此之大。我发现我们不太可能有 38MB 的内联函数,甚至计算模板和标题,更不用说使用inline关键字的了。如果有办法检查链接器步骤、输出或 obj 文件以查看正在扩展的内容,请发表评论 - 我会发现这非常有价值。

于 2013-09-17T00:50:15.817 回答