【问题标题】:How to use Delphi conditional compilation to generate exe or dll?如何使用Delphi条件编译生成exe或dll?
【发布时间】:2014-03-09 03:30:05
【问题描述】:

我正在使用 Delphi XE2,并且我有一个可以编译为 Win32 EXE 或 ISAPI DLL 的程序。效果很好。

但是我的问题是如何有条件地编译。

{$include MyConditionals.Inc}

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

这可行,但 FILE 扩展名出错了。它总是生成一个 EXE 扩展名。我需要在选择库条件时生成 DLL 扩展。

如何轻松更改条件并拥有正确的扩展名?

【问题讨论】:

  • 我认为最好为此使用两个单独的项目
  • @VitaliyG 我正在这样做,但是每次我添加一个新单元时,我都必须更新两个项目,并且我添加了许多单元,这样做很无聊。
  • 不管是不是无聊,都是正确的事情。您必须为不同的输出类型使用单独的项目。
  • @RemyLebeau 我同意做正确的事情。我的意思是无聊,因为自动化程度越高,麻烦就越少……

标签: delphi delphi-xe2 conditional-compilation


【解决方案1】:

AFAIK 您不能使用条件编译来更改二进制文件的扩展名。根据 .dproj 文件中 AppType 条目的值(应用程序、库、控制台)在构建过程中设置文件的扩展名。我的建议是为 dll 创建一个构建批处理文件,为应用程序创建另一个。

【讨论】:

  • 到目前为止,我发现:如果我将 $define 放在项目文件上而不是使用 INCLUDE,Delphi 会理解项目类型的变化并在 EXE 和 DLL 之间切换。但仅当项目在已设置的预期输出上打开时才有效。
  • 我之所以尝试这种方式,是因为大部分开发和测试都是使用 EXE 输出完成的,一些客户使用此输出,但我还有其他两种可能性。但是,要在其他项目上进行编译,我需要使用主项目上发生的更改来更新项目的 USES 子句。有些日子我需要每天做几次。我对多个项目都很好,但希望有一个“集成的”USES 子句。
【解决方案2】:

显然,IDE 本身会阻止您这样做。我从以下来源成功地生成了可执行二进制库和动态链接库:

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

begin
end.

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

Delphi IDE 认为它“拥有”项目源代码,因此建议不要在其中放置条件指令,即使在基于 MSBuild 的较新 IDE 中也是如此。

【讨论】:

  • 你说得对,它似乎可以做一些自动化,但这不是预期的,IDE确实拥有项目源
  • @eelias,你也可以试试$E 指令,看看它是否对你有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
相关资源
最近更新 更多