Delphi中对RC文件的依赖性检查

时间:2012-12-13 21:26:09

标签: delphi delphi-ide

如果RC文件被修改,Delphi将再次编译它。如果RC文件具有引用已更改文件的RCDATA或BITMAP声明,则Delphi不会再次将.RC文件重新编译为.RES,直到通过删除.RES文件或执行“触摸”(修改文件时间戳)强制它为止在顶级.RC文件。

以下是TEST.RC文件示例:

SAMPLE   RCDATA "File.txt"

当修改TEST.RC时,这将导致重新编译,当“File.txt”被修改时,但是Delphi不会在“编译”上重新编译资源。我不愿意只使用“Build”,因为它会将我的时间从几秒钟增加到几分钟。

有没有人让Delphi与.RC文本文件和依赖项一起正常工作?虽然有些人添加资源而从不更改它们,但我已经开始使用.RC文件来处理我经常更改的内容,例如.RC文件中RCDATA部分中的二进制或文本数据。

请注意,尝试在预构建或后期构建中添加“删除.res”步骤似乎打破了Delphi IDE /编译器。我可以在IDE外部进行外部排序(在运行msbuild之前总是删除某些.res文件),但在IDE中,Delphi并没有给我太多选择。

有没有人有解决方案? (我在Delphi 2007中遇到了这个问题,但是任何适用于从2007到XE3的任何版本Delphi的解决方案都是受欢迎的。)

1 个答案:

答案 0 :(得分:2)

这不是一个完美的答案,因为下面的示例没有进行依赖性检查,但是资源没有经常重建的基本问题是通过Always Rebuilding Every Time来解决的,这是足够好的。

这最终比Delphi的内置行为更正确,这种行为不同于(a)当您在IDE中使用它时从{$ R foo.res foo.rc}声明构建时,不会经常重新编译如果在.dpr文件中包含{$ R foo.res foo.rc}声明,则(b)根本不会从命令行构建更糟糕的状态。

所以,尽管如此,这是一个有效的预构建步骤,它完成了David建议我做的事情:

  call $(PROJECTDIR)\SubDir\foo.cmd $(PROJECTDIR)

这是我的foo.cmd包含的内容:

  cd %1\SubDir
  rc.exe foo.rc
  echo compiled foo RCDATA

对于任何想知道foo.rc可能包含它的人,它可能如下所示:

  SQL_QUERY_1  RCDATA  "SqlDir1\MYSQL.SQL"

ERRATA:

我发现{$R foo.res foo.rc}只能在IDE中从Delphi 2007中正确构建。从命令行MSBUILD,它将无法构建。你得到“DCC ERROR 1” 并且构建中止而没有真正的错误消息。您可能有兴趣知道delphi MSBUILD在错误日志或stdout中没有任何错误输出而神秘地中止编译的原因之一是当RC.exe返回错误级别时。 RC.exe输出一个真正的错误信息(嘿Delphi你给我发送了无效的命令行参数,我放弃了),并且Delphi DCC32不会将它转发给你,或者它以某种方式以其他方式吞噬并且没有回馈给用户,因此他们可以获得足够的信息来了解他们的构建为何神秘地破坏。令人讨厌的小msbuild-dcc32集成错误功能,即。

而不是{$ R subdir \ foo.res subdir \ foo.rc},你应该在你的DPR中有这个:

  {$R SubDir\foo.res}

这意味着“链接那个二进制资源,不要试图重新编译,因为我们已经做到了这一点”。以上所有内容只是为了明确David在评论中提出的建议。帽子提示大卫。