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

时间:2013-02-18 09:53:50

标签: delphi delphi-xe2

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

恕我直言,由于现有惯例,绝对不需要这样的条件。

编译应用程序或库(在编译方面相同)或包的不同之处如下:

  • 应用程序/库将仅编译单元中使用过的部分
  • 包将从单元的接口部分引用的单元中编译所有部件

示例单位

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文件的未使用的代码部分。