【发布时间】:2011-01-02 01:38:19
【问题描述】:
在新的 VCL 应用程序中,编译和构建操作生成相同的二进制文件和映射文件(即使“包含版本信息”在 .exe 文件末尾也有细微差别在项目中”选项已关闭 - 已经讨论过)。映射文件是相同的字节到字节。但是当我添加任何第三方组件时,Build 和 Compile 生成的二进制文件和 map(!) 文件有很大不同!
在两个版本的 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 文件。
为什么?有什么建议吗?
更新
关于我是如何发现这个的以及它为什么让我感兴趣的一些信息:
项目是使用 MSBuild 从简单脚本构建的。当在项目中通过 ITE 添加翻译(带有资源的 dll)时,我发现当项目构建时(来自脚本或来自 IDE) - 翻译版本工作错误 - 按钮、标签等上的一些文本来自错误的位置(字面意思是来自另一个按钮、标签)。当项目从 IDE 编译时 - 一切正常。所以我开始比较 Build 和 Compile 输出...
【问题讨论】:
-
不知道,但是从更简单的 3rd 方组件开始您的测试,然后才去更复杂的组件。还要确保来源保持 100% 相同。不同的USES子句(包括顺序!)可能会改变单元初始化表的布局,从而改变二进制文件。
-
源保持 100% 相同 - 我只构建和编译。
-
您还会发现 Build 和 Build 生成不同的二进制文件。它与编译和构建之间的区别无关。
-
@Rob:Build 和 Build 生成不同的二进制文件是什么意思?你的意思是编译和构建?
-
不,瑞恩。 Max 说如果你构建然后编译,你会得到不同的结果。但是如果你构建然后再次构建,你仍然会得到不同的结果。在这种情况下,编译和构建之间的区别无关紧要。
标签: delphi build compilation map-files