Delphi 编译和构建在同一项目上生成不同的二进制文件

2023-11-24

在新的 VCL 应用程序中Compile and Build操作生成相同的二进制文件和映射文件(即使关闭“在项目中包含版本信息”选项,.exe 文件末尾也有细微差别 - 已经讨论过)。映射文件的字节与字节相同。但是当我添加任何第三方组件时,构建和编译生成的二进制文件和映射(!)文件明显不同!

在 Delphi 的两个版本上进行测试:
- 版本 7.0(构建 8.1)
- CodeGear™ RAD Studio 2007 版本 11.0.2902.10471(+2007 年 12 月更新)

重现步骤:

  1. 创建新的 VCL 应用程序。可能添加任何本机 Delphi 组件(我尝试了 Standart、Additional、Win32 和 System 选项卡中的所有组件)。
  2. 在项目选项的链接器选项卡上打开详细地图文件。
  3. 构建项目.
  4. 重命名输出.exe 和.map 文件(例如:project1.exe 重命名为project1b.exe,project1.map 重命名为project1b.map)。
  5. 编译工程.
  6. 重命名输出.exe 和.map 文件(例如:project1.exe 重命名为project1c.exe,project1.map 重命名为project1c.map)。
  7. 比较步骤 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(使用前将#替换为@)

Delphi 编译和构建在同一项目上生成不同的二进制文件 的相关文章

随机推荐

  • 32 位进程可以在 64 位 Windows 操作系统上访问更多内存吗?

    据我了解 在没有 3GB 开关的 32 位 Windows 上 32 位进程只能访问 2 GB 内存 并且其中一些内存由于其自身的邪恶原因而被操作系统占用 这似乎与我的经验相符 因为我们有一个应用程序 当它达到 1 2 1 5 GB 左右的
  • 检查 [] 运算符

    Python中如何检查对象是否支持 操作 我想到了类似以下的事情 if supports obj print Supports 您不 检查支持 你只需使用它 try a obj whatever except TypeError whate
  • JAX-RS 接受图像作为输入

    相当长一段时间以来 我一直在开发 JAX RS Web 服务来满足我的开发需求 到目前为止我编写的所有方法都接受 java 字符串或原始类型作为输入 这种方法的一个例子 POST Path MyMethod Produces MediaTy
  • C++项目中ffmpeg的CMake配置

    我已经使用 Homebrew 安装了 ffmpeg 版本 4 并且尝试在 C 项目中使用各种 ffmpeg 库 但在链接过程中遇到多个错误 Undefined symbols for architecture x86 64 av free
  • 浏览器选项卡和窗口之间的区别

    在 Web 浏览器中 每个窗口都有自己的 JavaScript 环境 以及自己的 JavaScript 环境 全局对象 但看起来在同一窗口中打开一个新选项卡也会创建一个不同的全局对象 这是真的吗 新选项卡和新窗口之间的主要区别是什么 唯一的
  • IntelliJ IDEA 不会加载在我的磁盘上找到的 Groovy

    您好 我最近想开始在 Groovy 中进行开发 但是当我尝试 IntelliJ IDEA 时 它不会加载 Groovy 因为它显示 看起来指定路径中的 Groovy 分发已损坏 不能 确定版本 发生了什么事我什至尝试了一些旧版本 但它也不起
  • 使用 Mono.Cecil 发出对 System.Lazy 构造函数的调用

    我正在尝试发出一种实例化 System Lazy 的方法 但失败并出现 无效令牌 的 PEVerify 错误 位于该行newobj instance void class mscorlib System Lazy 1
  • Next.JS 代码为何同时在服务器和客户端上运行?

    在 Next JS 应用程序中 您会看到组件的代码在服务器和客户端上运行 因此 如果您有以下代码 const Title gt console log gt Hello return h1 Some title h1 然后您在开发环境中运行
  • 将 ObservableCollection 绑定到 DataGridView

    我正在将可观察集合 FoodList 绑定到 WinForm 中的 BindingSource 此 BindingSource 由表单上的数据网格使用 我假设当我向集合中添加一个新项目时 它会引发一个事件 并且一个新行会出现在我的网格中 但
  • 如何使用RVM管理多个gemset和ruby版本?

    我对 RVM 网站上给出的解释感到非常困惑 我不清楚不同的红宝石解释器和宝石集之间的关系 按照我的说法 是这样的 我的 Mac 帐户有一个 rvm 该 nvm 安装并管理一组不同版本的 ruby 解释器 每个红宝石版本都有一组宝石 我把事情
  • 从 mongoengine 中的文档获取必填字段?

    我希望能够获取我创建的文档所需的列表或某种字段集 例如 这是我的文档 nickName StringField required True password StringField required True firstName Strin
  • 设置 Fcm 通知优先级 - Azure 通知中心

    我正在尝试在 C SDK 中的 Fcm 通知有效负载上设置高优先级 以便从后端将其发送到移动应用程序 根据 Fcm 文档 Json Paylod 应该如下所示 message topic subscriber updates notific
  • 即使通过 PuTTY 连接到 Windows 上的 GitHub 时也出现问题

    我知道已经在各个地方 Stack Overflow 内外 讨论了这个问题 但我还没有找到一致有效的解决方案 现在 我正在尝试通过 putty 连接到 github 我正在连接到 github com 加载我的私钥 并获得 登录为 迅速的 当
  • CSS 目标只是类名以字符串开头和结尾

    我想为我们公司创建某些标准的 css 代码 作为品牌 我想以我的公司名称开始所有类名 并以 Cls 结尾 div class Nam StdCss Cls div div class Nam StdCss Raduis Cls div di
  • 如何最小化asp.net中页面的视图状态大小?

    如何最小化asp net中页面的视图状态大小 请帮忙 您有多种选择来减少 ViewState 禁用视图状态对于不需要它的控件 这是最有效的解决方案 例如 如果您可以在服务器上缓存一些数据 那么您可以为每个请求重新绑定任何数据绑定控件 并且不
  • Flutter中main函数和runApp()函数有什么区别?

    我倾向于问这个问题 因为大多数时候我们直接调用 runApp 函数 main 而不执行其他操作 我的问题是为什么 runApp 和 main 保持不同 可能很简单 保留 main 函数或 runApp 函数 而放弃其他函数 在 Dart 中
  • 正则表达式:如果字母与数字相邻,则添加空格

    我正在使用 PHP 但不太擅长使用正则表达式 我需要一个 preg replace 如果字母或数字相邻 它可以添加空格 这些是场景 mystreet12 gt mystreet 12 mystreet 38B gt mystreet 38
  • Base10 到 Base64 网址缩短

    我正在为一个正在学习 php 的项目编写一个 url 缩短函数 这是代码 顺便说一句 我想global这不是一件好事 P alphabet array 1 gt a b c d e f g h i j k l m n o p q r s t
  • 如何在 Pygame 中按住“按键”?

    我使用 Pygame 1 9 6 和 Python 3 7 4 我想按住空格键 它会不断地一遍又一遍地执行相同的操作 我知道如何按下按钮KEYDOWN 我看了下问题 如何在 Pygame 中有效地按住键 寻求答案 但无法理解一个答案 whi
  • Delphi 编译和构建在同一项目上生成不同的二进制文件

    在新的 VCL 应用程序中Compile and Build操作生成相同的二进制文件和映射文件 即使关闭 在项目中包含版本信息 选项 exe 文件末尾也有细微差别 已经讨论过 映射文件的字节与字节相同 但是当我添加任何第三方组件时 构建和编