与C++ Builder 2010相比,C++ Builder XE4中EXE大小增加三倍的原因是什么?

Dav*_*vid 9 delphi linker c++builder c++builder-xe4

我已将项目从RAD Studio 2010升级到RAD Studio XE4.该项目主要是使用C++ Builder的一半RAD Studio进行的C++,其中包括Delphi的一些内容.

在2010年,Release版本为22MB.在XE4下,相同的Release版本为55MB.

这是一个问题,因为:

  • 对于EXE来说,55MB非常大
  • 启动程序需要相当长的时间(不多,但有些.)
  • 我们的许多客户在海上时从偏远地区或船上下载新版本.大小事项.

是什么导致这种情况,我该如何解决?


笔记

  • 奇怪的是,调试版本仍然只有23MB.项目设置似乎非常相似.我扩展了选项集的导出,只看到<UsePackages>True</UsePackages>Release not 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 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现在已停止链接,链接器报告它内存不足(一个旧的,早就应该修复过的bug了.)没有生成.map或.tds文件,所以我不能给出比较大小准确.从内存来看,.tds大概是100MB,不幸的是我不记得.map的大小了.如果我得到项目链接,我会更新问题.
  • 再次编辑:我找到答案(sortof) - 将'扩展内联函数'关闭会将EXE大小减小到预期值.这令人费解 - 请参阅下面的答案.请注意,调试版本已经关闭并仍然无法链接,从而导致内存不足错误.
    我还没有将我的答案标记为正确,以防万一有人可以提供一些有关正在发生的事情的见解,这将是一个更好的答案,而不仅仅是"关闭此选项".

Dav*_*vid 7

解决了(排序)

Release版本已启用"扩展内联功能".关闭此功能可将EXE大小从55MB减少到17MB.

项目选项显示

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