如果修改了RC文件,Delphi将再次编译它.如果RC文件具有引用已更改文件的RCDATA或BITMAP声明,则Delphi不会再次将.RC文件重新编译为.RES,直到通过删除.RES文件或执行"触摸"(修改文件时间戳)强制它为止在顶级.RC文件.
这是TEST.RC文件的示例:
SAMPLE RCDATA "File.txt"
Run Code Online (Sandbox Code Playgroud)
当修改TEST.RC时,这将导致重新编译,当"File.txt"被修改时,但是Delphi不会在"编译"上重新编译资源.我不愿意只使用"Build",因为它将我的时间从几秒钟增加到几分钟.
有没有人让Delphi与.RC文本文件和依赖项一起正常工作?虽然有些人添加资源而从不更改它们,但我已经开始使用.RC文件来处理我可能经常更改的内容,例如.RC文件中RCDATA部分中的二进制或文本数据.
请注意,尝试在预构建或后构建中放置"删除.res"步骤似乎打破了Delphi IDE /编译器.我可以在IDE外部进行外部排序(在运行msbuild之前总是删除某些.res文件),但在IDE中,Delphi并没有给我太多选择.
有没有人有解决方案?(我在Delphi 2007中遇到了这个问题,但是任何适用于任何版本的Delphi从2007到XE3的解决方案都是受欢迎的.)
War*_* P 2
这并不完全是一个完美的答案,因为下面的示例没有进行依赖项检查,但是资源重建频率不够高的基本问题可以通过“每次都重建”来解决,这已经足够了。
这最终比 Delphi 的内置行为更正确,Delphi 的内置行为从 (a) 当您在 IDE 中使用 {$R foo.res foo.rc} 声明时重新编译的频率不够高,甚至更糟糕的状态(b) 如果您在 .dpr 文件中包含 {$R foo.res foo.rc} 声明,则根本不会从命令行进行构建。
因此,综上所述,这是一个有效的预构建步骤,它执行大卫建议我做的事情:
call $(PROJECTDIR)\SubDir\foo.cmd $(PROJECTDIR)
Run Code Online (Sandbox Code Playgroud)
这是我的 foo.cmd 包含的内容:
cd %1\SubDir
rc.exe foo.rc
echo compiled foo RCDATA
Run Code Online (Sandbox Code Playgroud)
对于任何想知道 foo.rc 可能包含什么内容的人来说,它可能如下所示:
SQL_QUERY_1 RCDATA "SqlDir1\MYSQL.SQL"
Run Code Online (Sandbox Code Playgroud)
勘误表:
我发现{$R foo.res foo.rc}只能在 Delphi 2007 的 IDE 中正确构建。从命令行 MSBUILD 中,它不会构建。您只会收到“DCC ERROR 1”,并且构建会中止,而不会出现真正的错误消息。您可能有兴趣知道,delphi MSBUILD 编译神秘中止而在错误日志或标准输出中没有任何错误输出的原因之一是当 RC.exe 返回错误级别时。RC.exe 输出一条真正的错误消息(嘿 Delphi,你向我发送了无效的命令行参数,我要放弃),并且 DelphiDCC32不会将其转发回给你,或者它以某种方式被吞噬并且没有返回以便用户能够获得足够的信息来了解为什么他们的构建会神秘地崩溃。讨厌的小 msbuild-dcc32 集成错误功能。
您的 DPR 中应该包含以下内容,而不是 {$R subdir\foo.res subdir\foo.rc}:
{$R SubDir\foo.res}
Run Code Online (Sandbox Code Playgroud)
这意味着“链接该二进制资源并且不要尝试重新编译,因为我们已经为您完成了”。以上所有内容只是为了明确大卫在评论中的建议。向大卫致敬。
| 归档时间: |
|
| 查看次数: |
1157 次 |
| 最近记录: |