【问题标题】:Delphi conditional compilingDelphi条件编译
【发布时间】:2010-06-23 10:20:28
【问题描述】:

我需要知道是否只有在源或任何使用的单元、包等已更改时才可以编译 delphi 项目。

如果这是不可能的,第二种选择:是否有任何选项可以生成完全相同的二进制文件编译两次相同的项目。

谢谢。

编辑:用于基于哈希的 WebUpdate。

【问题讨论】:

  • 我很确定 Delphi 不会编译未更改的单元,除非您构建。
  • 但它会生成不同的哈希值。它可以是时间戳或其他东西......但二进制文件总是不同的。
  • 查看版本信息,Delphi 2010 似乎将 CompileDate 放入 exe 中(它包括一天中的时间)。但是你为什么要两次制作相同的exe呢?我可以肯定地告诉你 Jens Björnhager 是对的,Delphi 不会编译未更改的单元(在为不同的项目使用不同的条件定义时会被此咬伤)。
  • 用法是这样的:我有一个非常大的项目组,所有的二进制文件都是基于哈希的网络更新。如果我进行一些更改然后执行 compile all 命令,所有文件都会更改其哈希值,但实际上只有一些文件需要更新。
  • 为此使用版本号:对于每个新版本,增加版本号。比你只需要比较版本号来查看是否有新版本。

标签: delphi compiler-construction executable delphi-2010


【解决方案1】:

Delphi“编译”只会编译更改的单元。但如前所述,单元有数据,因此编译器可以检查哪些需要更新,哪些不需要。并且可执行文件可以更改,因为构建过程可以重新排列 exe。您的网络更新不应该使用文件哈希,它应该使用版本信息来决定更新什么和不更新什么。这就是安装程序检查应该替换哪些文件的方式。

【讨论】:

  • 你的方法是对的,但我正在尝试更通用的方法。
  • 哈希只能告诉您文件是否不同,而不是文件是否较旧或较新。这也是添加版本信息的原因之一。
  • @Idsandon:如果文件相同 - 谁在乎哪个更新哪个更旧?更不用说外部文件属性可以告诉你了。版本信息的问题在于它需要更改(手动或自动)才能生效。如果没有自动时间戳更改没有覆盖这一事实,没有什么比哈希/文件比较更安全的了。
  • @Craig:OP 询问了网络更新功能。我不会冒险错误地用旧版本更新文件。好的,使用哈希不会替换相同的文件,但是不同的文件呢?哪个比较新?任何好的 Windows 安装实用程序(以及 Windows SetupAPI 本身)都依赖于版本信息来正确更新可执行文件。可以更改外部文件属性。版本信息,尤其是在签名文件中,更难操作。当然,您需要一个良好的构建过程来生成具有正确版本号的文件。
【解决方案2】:

Delphi 在编译时仅编译更改的单元,并编译所有单元而不考虑构建时的更改状态。

在二进制级别上,Exe 永远不会相同。刚建了两次项目,将exe重命名为txt扩展名,并与Beyond Compare进行了比较:它显示了差异。

【讨论】:

  • PE 标头中有一个时间戳和校验和,每次编译都会有所不同。
  • 是的,但差异远不止于此。事实上非常普遍......
  • 刚刚检查了我再次进行的比较。有很多差异,尽管大多数是两个 exe 之间完全相同类型的差异。见bjmsoftware.com/delphistuff/exe_comparison.jpg
  • 第一个是时间戳,34秒关闭。
  • 只是PE头的变化?是否可以使用 DCC32.exe 完全操作 PE 标头?
【解决方案3】:

一个(硬)解决方案:使用 Makefile 制作您的 exe! makefile 允许您说“这个 exe 是使用这些命令从这些文件中创建的”。如果您列出的组成 exe 的文件中至少有一个比您的 exe 新,则 Make 只会运行“那些命令”。

其中最困难的部分是设置构成 exe 的文件列表:您可以轻松获取 DPR/DPROJ 中列出的文件列表,但您还需要识别所有链接资源($ R)、所有包含的文件 ($INCLUDE)、所有由 Delphi 隐式编译的文件,因为它们在“uses”子句中使用并在库路径中找到。

为一般情况生成一个 Makefile 是非常困难的,但对于一个特定的项目,它可能会起作用。例如,您可能认为您的文件仅依赖于 DPR 文件中列出的文件,然后确保将所有相关文件添加到 DPR。

【讨论】:

    猜你喜欢
    • 2016-06-12
    • 2012-02-14
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2011-07-12
    • 2014-08-27
    • 1970-01-01
    相关资源
    最近更新 更多