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