2012-10-28 67 views
7

我想知道,如果這個項目是一個庫與否,閱讀我寫了這個代碼的幫助,不工作後:如何在編譯時告訴項目是程序還是庫?

{$IF DEFINED(LIBPREFIX)} 
    {$DEFINE PROJECT_IS_EXECUTABLE} 
    {$UNDEF PROJECT_IS_LIBRARY} 
{$ELSE} 
    {$DEFINE PROJECT_IS_EXECUTABLE} 
    {$UNDEF PROJECT_IS_LIBRARY} 
{$IFEND} 

我試着定義申報並

{$IF (LIBPREFIX = '')} 

每個嘗試總是返回相同的DLL和程序。 如何使用內置的編譯器指令來做到這一點?

編輯

我的目的是除去從 「PE文件」 的額外信息。

我直接在.dpr項目文件中做,所以不管其他單位如何編譯,但我不能在DLL項目中做同樣的事情。

因此,我正在尋找一種方法來阻止它在DLL項目中。

這是我如何解決這個問題,我這個指令添加到我的.dpr方案:

{$DEFINE STRIPE_PE_INFO} 
    {$DEFINE STRIPE_RTTI} 
    {$I DDC_STRIP.inc} 

而且DDC_STRIP.inc擁有所有的邏輯。

回答

11

編譯文件時無法知道這一點。源文件可以編譯爲.dcu文件,然後鏈接到任何類型的項目中。一個很好的例子是RTL和VCL單元。

可能最好的做法是在您的項目選項中定義一個條件,以指示項目是否爲庫。但是您需要確保在生成使用此單元的任何項目時總是重新編譯.dcu。

+0

這是事實,這是有道理的。 –

1

我能想到的最好的事情是在包含文件中設置一個定義。您可以使用預生成操作(bat文件)來修改包含文件。

6

你不能在編譯時確定這一點,但在運行時,可以檢查SysInit.ModuleIsLib(德爾福2007),以確定代碼在庫(或包)運行。

+0

同樣的正確性,'System.IsLibrary'是你在運行時需要檢測DLL的東西。但是這個問題特別提到了編譯時檢測,在這種情況下,這些變量都不適用。 –

相關問題