我們的團隊多年來一直使用Delphi 6,然後在2006年前切換到Delphi 2006。在這兩個版本中,我們遇到以下問題:通常編譯器會抱怨一個被推測爲遞歸使用的單元。這個單位是一個40k LOC單位,是一個項目的核心,擁有近100萬LOC(包括第三方)。不正確的循環參考錯誤
錯誤消息是不正確的:該項目的完整版本始終工作。不幸的是,這個錯誤信息並不能告訴我們所在的循環引用的位置,只是該單元的名稱。有時甚至會發生有效的錯誤消息被列出2-4次,直到該循環引用問題被「找到」。很明顯,編譯器在這裏以一個圓圈運行。由於該項目的大小,很難手動找到問題。因此,我製作了一個工具,其中證明確實沒有循環引用(該工具會創建單元的定向依賴關係圖並確定該圖中的相關性組件 - 除了我故意放置某些內容外,沒有其他功能)。
這不僅影響F9編譯,而且代碼完成/洞察力在大多數時間不工作。有時它工作時,我再次按Ctrl空間...
任何想法我們如何可以隔離甚至解決問題?請注意,將40k LOC單元拆分爲較小的單元將非常困難,因爲它包含大約15個大類,這些大類在接口部分相互依賴(我知道這很糟糕,但應該可以工作)。
更新
我們不斷地重構,但是這是一個艱難的單位重構,因爲一切都依賴於一切,幾乎。一直試圖通過接口繞過它,但我們正在談論一些具有100多種方法和屬性的類。它會更慢。
升級到D2009可能是一個可行的選擇,但現在我們堅持使用D2006(unicode和價格標籤是這裏的兩個瓶塞)。無論如何,如果問題有幫助的話,問題至少從D6開始就存在。
關於修剪使用條款,我們經常用Icarus來做這件事。但目前爲止這並沒有幫助。現在我們在接口部分下降到90個自定義單位。但是,對於真實的循環引用,問題可能出現在任何單元中。還嘗試將所有單位添加到dpr。
該項目與其他項目共享很多代碼,並且有一些IFDEF。但是,定義不是在項目選項中設置的,而是通過常用的包含文件。因此所有模塊應該看到相同的定義。而且,在完全重建之後不久,問題又重新出現,而不切換到另一個項目。
對,我們在所有項目(和更多)的完整構建腳本中使用dcc32。我並不期望將其用作IDE編譯的替代品;它不會幫助您瞭解代碼洞察力,以及誰知道當時需要多長時間。 但也許這是一種診斷問題的方法?理想情況下,dcc32增量會遇到同樣的問題,它的輸出會觸發一些想法... – 2009-05-25 18:53:01
是的,這正是我想要建議的,也許我沒有成功通過明確說明:-(抱歉,使用dcc32應該看看哪些文件被編譯了幾次,並且在哪個文件之後它全部停止了。除非IDE編譯器和dcc32真的不一樣,但是這個我不會假設。 – mghie 2009-05-25 20:21:13