2012-12-13 55 views
6

如果修改了RC文件,Delphi將再次編譯它。如果一個RC文件具有RCDATA或BITMAP聲明來引用已更改的文件,Delphi將不會再次將.RC文件重新編譯爲.RES文件,直到我強制刪除.RES文件或執行「touch」(修改文件時間戳)在頂層.RC文件。Delphi中對RC文件的依賴性檢查

下面是一個示例TEST.RC文件:

SAMPLE RCDATA "File.txt" 

當TEST.RC被修改,這將導致重新編譯,當「FILE.TXT」被修改,但是德爾福不重新編譯資源,上一個「編譯」。我不願意僅僅使用「Build」,因爲它將我的時間從幾秒鐘增加到幾分鐘。

有沒有人有過德爾福與.RC文本文件和依賴關係正常工作?授予一些人添加資源並且永遠不會改變它們,但是我已經開始使用.RC文件來處理我經常會改變的內容,例如.RC文件中RCDATA部分中的二進制或文本數據。

請注意,試圖在預構建或後構建中放置「刪除.res」步驟似乎會中斷Delphi IDE /編譯器。在IDE之外構建時,我可以在外部對其進行排序(在運行msbuild之前總是刪除某些.res文件),但在IDE內部,Delphi不給我太多選擇。

有沒有人有解決方案? (我在Delphi 2007中遇到了這個問題,但是任何可以與從2007年到任何版本的Delphi一起工作到XE3的解決方案都會受到歡迎。)

+0

你試過調用命令行解釋器嗎?類似cmd.exe/c「del * .res」 – jachguate

+1

我總是在預編譯腳本中編譯資源 –

+1

del不能工作(它會混淆delphi IDE編譯器),但是會觸發pre foo.rc生成事件的作品。我想在預編譯中執行「rc.exe」命令也是完美的。 –

回答

2

這不完全是一個完美的答案,因爲沒有依賴性檢查是由在樣本下方,但資源未被足夠頻繁地重建的基本問題由每次總是重建來確定,這足夠好了。

這最終比Delphi的內置行爲更爲正確,它不同於(a)當您在IDE中使用它時從{$ R foo.res foo.rc}聲明進行構建時沒有足夠頻繁地重新編譯(b)如果在.dpr文件中包含{$ R foo.res foo.rc}聲明,則根本不會從命令行構建。

因此,所有的是,這裏的工作預生成步驟,其所做的大衛建議我做:

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錯誤1」 和構建中止沒有一個真正的錯誤消息。您可能有興趣知道,delphi MSBUILD編譯神祕地中止沒有任何錯誤日誌中的錯誤輸出或stdout的原因之一是當RC.exe返回一個錯誤級別。 RC.exe輸出一個真正的錯誤信息(嘿德爾福,你發給我無效的命令行參數,我放棄了),或者德爾福DCC32不會轉發給你,或者它以某種方式否則吞噬,而不是給予回到用戶身上,這樣他們就可以獲得足夠的信息來知道爲什麼他們的構建神祕地破裂了令人討厭的小msbuild-dcc32集成錯誤的功能,即。

取代{$ R子目錄\ foo.res子目錄\ foo.rc},你應該在你的DPR有這樣的:

{$R SubDir\foo.res} 

這意味着「鏈接二進制資源,也不要試圖重新編譯,因爲我們已經這樣做了「。以上所有內容僅僅是爲了明確David在評論中提出的建議。帽子給大衛提示。

+0

對ERRATA信息無效 –