如何使用Delphi条件编译生成exe或dll?
我使用的是Delphi XE2,我有一个可以编译为Win32 EXE或ISAPI DLL的程序。那很好 然而,我的问题是如何有条件地编译如何使用Delphi条件编译生成exe或dll?,delphi,delphi-xe2,conditional-compilation,Delphi,Delphi Xe2,Conditional Compilation,我使用的是Delphi XE2,我有一个可以编译为Win32 EXE或ISAPI DLL的程序。那很好 然而,我的问题是如何有条件地编译 {$include MyConditionals.Inc} {$ifdef ISAPISERVER} library {$else} program {$endif} MyProgram; 这是可行的,但是文件扩展名出错了。它总是生成一个EXE扩展名。我需要在选择库条件时生成DLL扩展名 如何轻松地更改条件并获得正确的扩展名?AFAIK您不能使用条件编
{$include MyConditionals.Inc}
{$ifdef ISAPISERVER}
library
{$else}
program
{$endif}
MyProgram;
这是可行的,但是文件扩展名出错了。它总是生成一个EXE扩展名。我需要在选择库条件时生成DLL扩展名
如何轻松地更改条件并获得正确的扩展名?AFAIK您不能使用条件编译来更改二进制文件的扩展名。根据.dproj文件中
AppType
项的值(应用程序、库、控制台),在生成过程中设置文件的扩展名。我的建议是为dll创建一个构建批处理文件,为应用程序创建另一个。显然,IDE本身阻止了您这样做。我成功地从以下来源生成了可执行二进制和动态链接库:
{$IFDEF CGI}program{$ELSE}library{$ENDIF} test;
begin
end.
使用dcc32-DCGI test.pas
和dcc32-DNSAPI test.pas
命令
Delphi IDE认为它“拥有”的是项目源,因此建议不要在那里放置条件指令,即使是在较新的基于MSBuild的IDE中也是如此。我认为最好使用两个单独的项目来实现this@VitaliyG我是这样做的,但是每次我添加一个新单元,我都要更新两个项目,我添加了很多单元,做那件事很无聊。不管无聊与否,这都是正确的做法。您必须对不同的输出类型使用不同的项目。@RemyLebeau我同意做正确的事情。我的意思是无聊,因为自动化程度越高,麻烦就越少,问题也就越少……到目前为止,我发现:如果我将$define放在项目文件上,而不是使用INCLUDE,那么Delphi就可以理解项目类型的变化,并在EXE和DLL之间切换。但是只有当项目在已设置的预期输出上打开时才有效。我尝试这种方法是因为大部分开发和测试都是使用EXE输出完成的,一些客户使用此输出,但我还有两种其他可能性。然而,为了在其他项目上编译,我需要用主项目上发生的更改更新项目的USES子句。有时我每天需要做几次。我对不止一个项目很满意,但我希望有一个“集成的”USES子句。你说得对,它似乎能够实现一些自动化,但这不是预期的,IDE确实拥有这个项目source@eelias,您也可以尝试使用
$E
指令,看看它在您的情况下是否有用。