Delphi XE2: IMPLICITBUILDING指令在包中的目的是什么?

8

当我尝试在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.
2个回答

3
请参考以下讨论:当我更改项目选项时,为什么Delphi会更改Indy的dpk源文件这个
在$IFDEF IMPLICITBUILDING和$ENDIF之间出现的编译器指令通常是由编译器在明确编译包时作为参数传递的。由于这些选项会根据配置(调试/发布)和目标平台(Win32、Win64、OSX32)发生变化,因此在包项目源中静态定义它们可能会导致问题。当在项目源中定义时,它们将始终覆盖编译器传递的选项。$IFDEF防止在明确编译期间使用这些选项。
在隐式编译包的情况下,将使用这些选项,但除非您保存了要编译的配置/目标模式,否则可能无法获得预期结果。
通常最好禁用包上的隐式构建,并通过项目组构建或通过项目依赖项明确地对其进行编译。如果您只针对单个平台使用单个配置进行构建,则隐式构建机制就足够了。
IMPLICITBUILDING是由编译器在编译作为其依赖项之一的东西的一部分而被隐式编译的包的编译过程中定义的。如注释中所示,您不应尝试自己定义此值。

2

猜测这与条件块下方的{$IMPLICITBUILD ON}标志相关。我猜想只要编译器执行隐式构建(与显式构建相比),它就会被设置。我不知道为什么只有在这种情况下才应该考虑这些设置。目前肯定没有文档记录。


5
这似乎是解决一个问题的变通方法,因为使用msbuild脚本编译软件包时会忽略所有dproj编译器选项,因为编译器是从dpk文件中读取它们的。 - Andreas Hausladen
@Andreas:啊,是的,这就解释了。 - Rudy Velthuis
@RudyVelthuis 我是 Delphi 生态系统的新手。您能否请好心解释一下隐式构建和显式构建之间的区别?我已经搜索过了,但没有找到有用的信息。谢谢! - santiagoIT
1
据我所知(但我可能错了),IMPLICITBUILD ON 表示如果需要,包将被重新构建,而 OFF 则表示只有在用户开始重新构建时才会重新构建。请参见此处:http://docwiki.embarcadero.com/RADStudio/XE3/en/Implicit_Build_%28Delphi%29 - Rudy Velthuis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接