在新的 VCL 应用程序中Compile and Build操作生成相同的二进制文件和映射文件(即使关闭“在项目中包含版本信息”选项,.exe 文件末尾也有细微差别 - 已经讨论过)。映射文件的字节与字节相同。但是当我添加任何第三方组件时,构建和编译生成的二进制文件和映射(!)文件明显不同!
在 Delphi 的两个版本上进行测试:
- 版本 7.0(构建 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 文件。
为什么?有什么建议么?
UPDATE
关于我如何找到这个以及为什么我对它感兴趣的一些信息:
项目是使用 MSBuild 从简单脚本构建的。当在项目中通过 ITE(带有资源的 dll)添加翻译时,我发现当项目构建时(从脚本或从 IDE) - 翻译版本工作错误 - 按钮、标签等上的一些文本来自错误的位置(实际上是来自另一个地方)按钮、标签)。当项目从 IDE 编译时 - 一切正常。所以我开始比较构建和编译输出......
您所看到的只是编译器内置 make 逻辑的产物。当您进行构建时,它会告诉编译器构建所有可用的源。因此,Delphi 处理每个源文件,并为它找到源的使用列表中的每个单元构建该文件。它递归地执行此操作。当您进行编译时,只会加载现有的 .dcu 文件,如果发现它们是最新的,则不会执行任何操作。这实际上会导致发现单元的顺序不同,因为每个 .dcu 都会有效地“展平”使用列表。由于这些单元以不同的顺序被发现和加载,因此它们依次以不同的顺序链接。这就是为什么您的地图文件看起来如此不同。给定相同的源,如果您连续进行两次构建或连续两次编译,映射文件应该是相同的。
造成差异的其他原因更为常见,包括 PE 标头时间戳以及其他填充和对齐位等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)