Delphi中的库项目是否有条件定义?

Delphi中的库项目是否有条件定义?,delphi,delphi-xe2,Delphi,Delphi Xe2,我有一个实用程序单元,代码在几个应用程序和DLL之间共享。我希望根据当前项目类型有选择地编译本单元的各个部分:应用程序、包或库。我在系统单元中找不到任何库或包的条件定义,谷歌也找不到任何相关内容。那么,编译器是否设置了任何条件定义,如IsLibrary或IsPackage?顺便说一下,我知道IsLibrary变量。没有这样的预定义条件,也不可能有这样的条件。这是因为在编译时,不可能知道该单元最终是否会链接到可执行文件、库或包中 事实上,同一个编译单元可以链接到上述任何或所有项目类型中。事实上,当

我有一个实用程序单元,代码在几个应用程序和DLL之间共享。我希望根据当前项目类型有选择地编译本单元的各个部分:应用程序、包或库。我在系统单元中找不到任何库或包的条件定义,谷歌也找不到任何相关内容。那么,编译器是否设置了任何条件定义,如IsLibrary或IsPackage?顺便说一下,我知道IsLibrary变量。

没有这样的预定义条件,也不可能有这样的条件。这是因为在编译时,不可能知道该单元最终是否会链接到可执行文件、库或包中


事实上,同一个编译单元可以链接到上述任何或所有项目类型中。事实上,当您将RTL链接到项目中时,您自己也可以看到这一点。无论项目类型如何,都可以将相同的系统单元、相同的编译.dcu文件链接到所有项目中。

由于现有惯例,因此绝对不需要此类条件

在此编译方面编译应用程序或库相同,或编译包不同,如下所示:

应用程序/库将仅编译单元中使用的零件 软件包将编译单元接口部分引用的单元的所有部分 示例单元

unit foo;

interface

procedure foo1;
procedure foo2;

implementation

procedure foo3; 
begin
  // used by foo2, compile depends on foo2 compilation
end;

procedure foo4;
begin
  // will never be compiled, because is never used
end;

procedure foo1;
begin
  // Package: will always be compiled
  // Application/Library: will be compiled if used 
end;

procedure foo2;
begin
  // Package: will always be compiled
  // Application/Library: will be compiled if used 

  foo3;

end;

end.

这也是为什么使用包可能会产生更大的exe文件的原因,因为它可能包含预编译dcu文件中未使用的代码部分。

因此,对我来说,最简单的方法是在每个项目的第一行包含{$DEFINE is…}。对吗?基本上是的,这就是你需要做的。但要让它工作起来,你需要把它放在一个.inc文件中,你可以把它放在任何地方,或者放在你的项目选项中。如果它是在.dpr文件中定义的,那么它将只在.dpr文件中可见。如果我在uses子句之前定义它,它在已使用的单位中不可见吗?不,这没有帮助。代码中定义的条件仅在定义它们的单元中生效。如果你想在项目范围内定义它,需要在项目选项中完成。谢谢你的解释,但这不是我的情况。此实用程序单元正在使用另一个具有初始化部分的单元,这些单元将被编译并链接到我的DLL中,无论它们是否被使用。如果我有时间,我会把代码分成两个独立的单元,但目前我负担不起。