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大小减小到预期值.这令人费解 - 请参阅下面的答案.请注意,调试版本已经关闭并仍然无法链接,从而导致内存不足错误.
 我还没有将我的答案标记为正确,以防万一有人可以提供一些有关正在发生的事情的见解,这将是一个更好的答案,而不仅仅是"关闭此选项".