在Delphi中对RC文件进行依赖性检查

7
如果修改了一个RC文件,Delphi会重新编译它。如果一个RC文件有RCDATA或BITMAP声明,而这些声明引用的文件已经发生了变化,除非我通过删除.RES文件或对顶层.RC文件进行“touch”操作(修改文件时间戳),否则Delphi不会再次将.RC文件重新编译为.RES文件。
以下是一个示例TEST.RC文件:
SAMPLE   RCDATA "File.txt"

当TEST.RC被修改时,会导致重新编译;但是当"File.txt"被修改时,Delphi在"Compile"时不会重新编译资源。我不想只使用"Build",因为这会将我的时间从几秒钟增加到几分钟。
有人成功地让Delphi与.RC文本文件和依赖项正常工作吗?尽管有些人添加资源后从未更改过它们,但我已经开始使用.RC文件来存储二进制或文本数据,这些数据位于.RC文件中的RCDATA部分。
请注意,在pre-build或post-build中添加"delete .res"步骤似乎会破坏Delphi IDE/编译器。在IDE外部构建时(始终在运行msbuild之前删除某些.res文件),我可以解决这个问题,但在IDE内部,Delphi没有给我太多选择。
有人有解决方案吗?(我在Delphi 2007中遇到了这个问题,但任何适用于2007至XE3版本的Delphi的解决方案都受到欢迎。)

你尝试过调用命令行解释器吗?类似cmd.exe /c "del *.res"这样的东西。 - jachguate
1
我总是在预构建脚本中编译资源。 - David Heffernan
1
del 命令无法正常工作(它会混淆 Delphi IDE 编译器),但在预构建事件中执行 touch foo.rc 命令可以解决问题。我想在预构建事件中执行 "rc.exe" 命令也是完美的解决方案。 - Warren P
我也遇到了这个问题。我的解决方案是在构建之前始终删除res文件。我有一个调用MSBuild的PowerShell脚本,所以我只需在其中加入一行代码即可。 - Brian Frost
也许,使用适当的makefile和好用的make.exe会有所帮助?当然,如果维护成本可以接受的话。 - Serhii Kheilyk
这在命令行中可能还好,但在 Delphi IDE 中运行时几乎没有帮助。 - Warren P
1个回答

2
这并不是一个完美的答案,因为下面的示例没有进行任何依赖项检查,然而资源不够频繁地重建的基本问题已被"每次都重新构建"修复,这已经足够好了。
最终结果比Delphi内置行为更加准确。Delphi的内置行为存在以下两种情况:(a) 从IDE中使用{$R foo.res foo.rc}声明时,不够频繁重新编译;(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}只有在Delphi 2007的IDE中才能正确构建。使用命令行MSBUILD时,它无法构建。你只会得到“DCC ERROR 1”,然后构建就会中止而没有真正的错误消息。你可能会感兴趣知道,Delphi MSBUILD编译中断并没有输出任何错误日志或标准输出的原因之一是RC.exe返回了一个错误级别。RC.exe输出了一个真正的错误消息(嘿,Delphi,你给我的命令行参数无效,我放弃了),但要么Delphi的DCC32没有将其转发回来,要么它被吞掉了,没有向用户返回足够的信息,以便他们知道为什么构建突然中断。这是一个非常讨厌的小的msbuild-dcc32集成问题。

你应该在你的DPR中写成{$R subdir\foo.res},而不是{$R subdir\foo.res subdir\foo.rc}

  {$R SubDir\foo.res}

那意味着“链接二进制资源,不要尝试重新编译,因为我们已经为你完成了”。以上所有内容只是为了明确David在评论中提出的建议。向David致敬。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接