7

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

这是一个示例 TEST.RC 文件:

SAMPLE   RCDATA "File.txt"

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

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

请注意,尝试在预构建或构建后放置“删除 .res”步骤似乎会破坏 Delphi IDE/编译器。在 IDE 外部构建时,我可以从外部解决这个问题(在运行 msbuild 之前始终删除某些 .res 文件),但在 IDE 内部,Delphi 并没有给我太多选择。

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

4

1 回答 1

2

这不是一个完美的答案,因为下面的示例没有进行依赖性检查,但是资源没有足够频繁地重建的基本问题通过每次都重建来解决,这已经足够好了。

最后,这比 Delphi 的内置行为更正确,后者从 (a) 在您从 {$R foo.res foo.rc} 声明构建时没有足够频繁地重新编译,当您在 IDE 中使用它时,它会变得更糟(b) 如果您在 .dpr 文件中包含 {$R foo.res foo.rc} 声明,则根本不从命令行构建。

因此,尽管如此,这是一个有效的预构建步骤,它执行 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"

勘误表:

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

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

  {$R SubDir\foo.res}

这意味着“链接该二进制资源并且不要尝试重新编译,因为我们已经这样做了”。以上所有内容只是为了明确大卫在评论中的建议。给大卫的帽子小费。

于 2012-12-14T20:05:44.380 回答