2012-08-23 22 views
1

我有一個程序使用庫(DPK /可視化控件)。該庫在Debug模式下編譯。這意味着優化設置爲OFF,RangeChecking爲ON等等。庫被設置爲'根據需要重建'。我不打算重新發布它(僅限內部使用)。如果我更改使用它的項目的設置,是否會重新編譯「根據需要重建」庫?

如果我在「發佈」模式下編譯我的程序會發生什麼?庫中包含的代碼將自動重新編譯爲'Release'模式?或者我必須首先加載DPK並在'Release'模式下重新編譯我的庫?


更新:
相關「重建需要」 Embarcadero公司的幫助說明了一切:「構建一個軟件包需要」。 我把它解釋爲'如果程序是以發佈模式編譯的,那麼庫需要重新編譯,所以我們會爲你做'。 我的解釋是否......聖經?


該實驗表明,(在上述的條件下)包含在庫中的代碼將基於DPR的設置,而不是在DPK的設置編譯成EXE。

編譯器不關心DPK文件時,將其重新編譯了PAS文件(僅適用於該DPK在沒有IDE加載)。**

因此,這裏的(容易在所有系統中複製)的證明: 讓我們調用我的程序Prog.DPR(包含Prog.pas)和我的庫Lib.DPK(包含LibUnit.pas)。該庫包含TMyPanel可視化控件。 DPR處於釋放模式。 DPK處於調試模式。

I install the library. I exit the library ('Close all'). 
I load the DPR in IDE, I also load LibUnit (Attention: I load only the unit, not the DPK) 
I put TMyPanel on my program's form. 
The LibUnit is automatically added to the USES clause on my program. 
I edit LibUnit. I compile. It works. New DCU file is generated for LibUnit. 
I go to library's folder and I delete the DPK (and the Dproj) but I keep LibUnit.pas. 
I edit LibUnit. I compile. Still works! New DCU file is generated for DCU file is generated for LibUnit.!!!! 

的問題是:如果有關於LibUnit應該如何編譯(PDK的被刪除)沒有信息,是如何LibUnit編譯?????很顯然,編譯器使用了DPR的設置。這是'發佈'模式。這意味着我的圖書館作爲「發佈」被整合到了程序中。 。

+0

什麼是「VCL」?只有「VCL」。它與Delphi一起提供,並且不編譯它。 –

+0

確保您的調試版本使用調試dcu,而您的版本不包含。您通過庫路徑(或項目選項)執行此操作。正如@David所說,你不會編譯VCL ...... –

+0

是的,你會想要在發佈模式下發布庫構建,而不是在調試模式下構建庫。 –

回答

5

在可執行文件中調試和釋放目標之間的切換不會導致重建任何引用的運行時包。

包自有的選項獨立於使用它們的項目。這是唯一可能的設計選擇。想象一下,如果你有一個包被其他兩個項目使用,A和B.現在,A是爲調試而構建的,但B是爲了發佈而構建的。該包不能同時爲兩者構建。

「根據需要重建」意味着如果最新版本與軟件包源相比已過時,則軟件包將被重新構建。


關於您的問題更新中的「實驗」,最有可能的是您的exe在運行時並未鏈接到包。而是將.pas文件直接編譯並鏈接爲您的exe項目的一部分。

+0

使用軟件包項目文件 –

+0

中指定的任何設置,我不明白你的意思。很難看到一個軟件包如何在不參考其.dpk和.dproj文件的情況下進行編譯。 –

+0

當然,刪除所有的源代碼後很難重新編譯一個軟件包。我只能猜測你實驗中發生了什麼。同樣,我在答案中說的是正確的。 –

0

本實驗顯示(在上述條件中)庫中包含的代碼將根據DPR的設置而不是DPK的設置編譯到EXE中。

編譯器在重新編譯其PAS文件時不關心DPK文件(只適用於未在IDE中加載DPK時)。**

所以這裏是(容易在所有系統中重現)證明: 讓我們打電話給我的程序Prog.DPR(包含Prog.pas)和我的庫Lib.DPK(包含LibUnit.pas)。該庫包含TMyPanel可視化控件。 DPR處於釋放模式。 DPK處於調試模式。

  • 我安裝庫。我退出圖書館('關閉所有')。
  • 我在IDE中加載DPR,我也加載LibUnit(注意:我只加載單元,而不是DPK)
  • 我把TMyPanel放在我的程序表單上。
  • LibUnit自動添加到我的程序的USES子句中。
  • 我編輯LibUnit。我編譯。有用。爲LibUnit生成新的DCU文件。
  • 我去圖書館的文件夾,我刪除了DPK(和Dproj),但我保留LibUnit.pas。
  • 我編輯LibUnit。我編譯。仍然有效!爲LibUnit生成DCU文件的新DCU文件。

的問題是:如果有關於LibUnit應該如何編譯(PDK的被刪除)沒有信息,是如何LibUnit編譯?????很顯然,編譯器使用了DPR的設置。這是'發佈'模式。這意味着我的圖書館作爲「發佈」被整合到了程序中。 。

相關問題