Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Delphi条件编译生成exe或dll?_Delphi_Delphi Xe2_Conditional Compilation - Fatal编程技术网

如何使用Delphi条件编译生成exe或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您不能使用条件编

我使用的是Delphi XE2,我有一个可以编译为Win32 EXE或ISAPI DLL的程序。那很好

然而,我的问题是如何有条件地编译

{$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
指令,看看它在您的情况下是否有用。