当我尝试在 Delphi XE2 中创建新包时,包 dpk 源文件中有一个新的构造:IMPLICITBUILDING
那是做什么用的?
package Package1;
{$R *.res}
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION OFF}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES ON}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DEFINE DEBUG}
{$ENDIF IMPLICITBUILDING}
{$IMPLICITBUILD ON}
requires
rtl;
end.
另请参阅此讨论:当我更改项目选项时,为什么 Delphi 会更改 Indy 的 dpk 源文件 和 this。
出现在 $IFDEF IMPLICITBUILDING 和 $ENDIF 之间的编译器指令通常在显式编译包时由编译器作为参数传递。 由于这些选项根据配置(调试/发布)和目标平台(Win32、Win64、OSX32)而变化,因此在包项目源中静态定义它们是有问题的。 当在项目源中定义时,它们将始终覆盖编译器传递的选项。 $IFDEF 防止在显式编译期间使用这些选项。
在隐式编译包的情况下,将使用这些选项,但除非您的项目保存在您想要编译的配置/目标模式下,否则您可能无法获得预期的结果。
作为一般规则,最好禁用包上的隐式构建,并通过项目组构建或通过项目依赖项显式编译它们。 如果您仅使用单一配置为单一平台构建,那么隐式构建机制就足够了。
IMPLICITBUILDING 是编译器在编译包时定义的,该包作为依赖于它的东西的编译的一部分而被隐式编译。 正如评论中所示,您不应该尝试自己定义这个值
我假设它与条件块下方的{$IMPLICITBUILD ON}标志有关。我猜想,只要编译器执行隐式构建(与显式构建相比),它就会被设置。我不知道为什么只有在这种情况下才应该考虑这些设置。当然还没有记录。