2014-02-11 92 views
2

我正在使用Delphi XE2,並且我有一個可以編譯爲Win32 EXE或ISAPI DLL的程序。這工作正常。如何使用Delphi條件編譯生成exe或dll?

但是我的問題是如何有條件編譯。

{$include MyConditionals.Inc} 

{$ifdef ISAPISERVER} 
library 
{$else} 
program 
{$endif} 
    MyProgram; 

雖然有效,但FILE擴展名出錯了。它總是生成一個EXE擴展。當我選擇庫條件來生成DLL擴展時,我需要它。

如何才能輕鬆改變病情,並有正確的擴展?

+1

我認爲最好爲這個 – VitaliyG

+0

@VitaliyG使用兩個單獨的項目,但是我每次添加一個新的單元時,都必須更新這兩個項目,並添加了很多單元,這樣做很無聊。 –

+1

無論是否無聊,這都是**正確的**。您必須爲不同的輸出類型使用單獨的項目。 –

回答

3

AFAIK您不能使用條件編譯來更改二進制文件的擴展名。該文件的擴展名在構建過程中設置,具體取決於.dproj文件中AppType條目的值(應用程序,庫,控制檯)。我的建議是爲dll和應用程序創建一個構建批處理文件。

+0

這是我迄今爲止發現的:如果我把我的$定義在項目文件,而不是使用INCLUDE,德爾福理解項目類型和切換的變化EXE和DLL之間。但只有當項目在預定輸出設置時打開時纔有效。 –

+0

我正在嘗試這種方式,因爲大部分開發和測試都是使用EXE輸出完成的,有些客戶使用這個輸出,但我還有其他兩種可能性。但是爲了在其他項目上編譯,我需要使用主項目上發生的更改來更新項目的USES子句。有幾天我需要每天多次這樣做。我對多個項目很滿意,但希望有一個「集成」USES子句。 –

2

顯然,IDE本身阻止你這麼做。我成功地產生兩個可執行的二進制和動態鏈接庫從以下源:

{$IFDEF CGI}program{$ELSE}library{$ENDIF} test; 

begin 
end. 

dcc32 -DCGI test.pas使用和dcc32 -DNSAPI test.pas命令。

Delphi IDE認爲它「擁有」項目源,所以建議不要在那裏放置條件指令,即使在基於較新的基於MSBuild的IDE中也是如此。

+0

你說得對,看來它有能力做一些自動化操作,但這不是預期的,IDE真的擁有項目源 –

+0

@eelias,你也可以試試'$ E'指令,看看它是否有用你的情況。 –

相關問題