2

我有一个实用程序单元,其代码在几个应用程序和 DLL 之间共享。我想根据当前项目类型有选择地编译本单元的某些部分:应用程序、包或库。我在单元中找不到库或包的任何条件定义System,谷歌也没有找到任何相关的东西。那么,是否有任何条件定义,例如编译器IsLibraryIsPackage由编译器设置?顺便说一句,我知道这个IsLibrary变量。

4

2 回答 2

5

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

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

于 2013-02-18T09:58:47.910 回答
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文件中未使用的代码部分。

于 2013-02-18T11:30:17.957 回答