gpt4 book ai didi

delphi - Delphi 中 RC 文件的依赖性检查

转载 作者:行者123 更新时间:2023-12-03 14:54:29 24 4
gpt4 key购买 nike

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

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

SAMPLE   RCDATA "File.txt"

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

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

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

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

最佳答案

这并不完全是一个完美的答案,因为下面的示例没有进行依赖项检查,但是资源重建频率不够高的基本问题已通过“每次都重建”得到解决,这已经足够好了。

这最终比 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"

勘误表:

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

您的 DPR 中应该包含以下内容,而不是 {$R subdir\foo.res subdir\foo.rc}:

  {$R SubDir\foo.res}

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

关于delphi - Delphi 中 RC 文件的依赖性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13868748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com