簡體   English   中英

在Delphi中編譯和構建有什么區別?

[英]What is the difference between compiling and building in Delphi?

使用Delphi-6有兩個選項:Build和Compile。

我知道當我運行程序時,它只編譯已更改的文件,並將DCU用於那些沒有更改的文件。 當我點擊構建顯然它重建DCU。

我一直在想的是,當我制作一個程序用於發布(更改構建設置,條件變量等)時,我可以編譯,還是必須進行完整構建?

如果我不進行完整構建會發生什么,是否有任何后果?

@Daisetsu,這是構建和編譯之間的區別。

當源代碼可用時, Build會編譯項目中所有已使用的單元。

編譯僅編譯已更改的已使用單位。

根據我個人的經驗,當您更改編譯器的配置時,您必須執行應用程序的構建,以便更改將反映在項目的所有單元中。

什么時候編譯?

編譯器僅在.pas源文件的日期時間戳更改時自動重新編譯單元(1,2)。

對於項目中的其他狀態更改(指令,調試或其他編譯器設置等),編譯器不會自動重新編譯。 那是你需要強制構建的時候。

當.inc或其他包含的($ I)文件更改(3)時,您還需要強制重建,因為它們的日期時間戳未被選中。

總而言之,當除了單位.pas文件之外的任何內容發生更改時,您需要進行構建。

建築中有一些奇怪的情況。 大多數會導致“無法找到單位xxx”錯誤,而它似乎存在

  1. 一個是項目中單元的路徑錯誤,或者工作目錄錯誤時使用相對路徑。 (參見Delphi調試錯誤的單元
  2. (我不完全確定這個,這是一個假設)。因為CRC(1)而重新編譯.dcu,但新編譯的dcu放在不同的目錄中。 這對於當前編譯來說不是問題(因為已經加載了正確的dcu),但是在隨后的編譯(例如依賴包)中,再次找到舊的dcu文件,並且源不是 - >錯誤。 如果有疑問,請通過遞歸刪除所有DCU來清理您的構建目錄
  3. 在.dpr中提到的單元路徑錯誤

(1)如果Delphi就像FPC那樣,.dcu包含它所依賴的所有dcu的接口部分的CRC。 這可用於檢查是否還需要重新編譯。 例如,由於文件系統操作(移動dcu的約)

(2)對於專家,也看看{$ implicitbuild xx}

(3)與Delphi相反,FPC確實在.inc更改上重建。 FPC項目在內部大量使用.inc文件,這個更改已經存在於Delphi支持之前。 因此,將“define”inc文件復制到任何目錄中的軟件包將無法使用FPC進行編譯,因為它們的大小和CRC通常略有不同。 Indy(10)就是一個很好的例子。

更改設置時應始終構建。

以前編譯的DCU文件可能已使用不同的設置進行編譯,例如編譯器定義。 這可能導致同一項目中的兩個單元使用不同的設置進行編譯。

在准備發布時,你肯定應該做一個完整的版本。
沒有理由不這樣做,Delphi的編譯器足夠快。

澄清可重復發布的重要性

  • 准備發布時,您將擁有其他人將使用的產品版本。
  • 如果他們報告問題,您可能需要返回該版本來測試並解決問題。
  • 如果你沒有做一個完整的構建,而是依靠現有的DCU的有機會 ,你的源文件的一個沒有得到重新編譯。
  • 即使這種可能性相當小,這種機會也會嚴重妨礙您快速解決問題的能力。
  • 隨着系統變得越來越大,相互依賴性越來越大,並且“野外”支持更多版本,這個問題就越來越嚴重。

為了您自己的理智 ,我強烈建議您始終為可釋放版本進行完整構建。
即使對於不可發布的版本,我也經常進行完整版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM