在新的 VCL 应用程序中,编译和构建操作生成相同的二进制文件和映射文件(即使“在项目中包含版本信息”选项已关闭,.exe 文件末尾也有细微差别 - 已经讨论过)。映射文件是相同的字节到字节。但是当我添加任何第三方组件时,Build 和 Compile 生成的二进制文件和 map(!) 文件有很大不同!
在两个版本的 Delphi 上测试:
- 7.0 版(Build 8.1)
- CodeGear™ RAD Studio 2007 版 11.0.2902.10471(+2007 年 12 月更新)
重现步骤:
- 创建新的 VCL 应用程序。可能添加任何本机 Delphi 组件(我尝试了 Standart、Additional、Win32 和 System 选项卡中的所有组件)。
- 在项目选项的链接器选项卡上打开详细地图文件。
- 构建项目。
- 重命名输出 .exe 和 .map 文件(例如:project1.exe 到 project1b.exe 和 project1.map 到 project1b.map)。
- 编译项目。
- 重命名输出 .exe 和 .map 文件(例如:project1.exe 到 project1c.exe 和 project1.map 到 project1c.map)。
- 比较第 4 步和第 6 步中的文件。(我使用 WinMerge 2.12.4.0)。
我们几乎没有不同的 .exe 文件和完全相同的 .map 文件。然后,如果我们再次重复所有步骤,但在项目中使用第三方组件(我尝试 ODAC、DOA、DevExpress 和自制),我们会得到更多不同的 .exe 和不同的 .map 文件。
为什么?有什么建议么?
更新
一些关于我如何发现它以及它为什么让我感兴趣的信息:
项目是使用 MSBuild 从简单的脚本构建的。当在项目中通过 ITE 添加翻译(带有资源的 dll)时,我发现当项目构建时(来自脚本或来自 IDE) - 翻译版本工作错误 - 按钮、标签等上的一些文本来自错误的位置(字面意思是来自另一个按钮、标签)。当项目从 IDE 编译时 - 一切正常。所以我开始比较构建和编译输出......