1

我有一个使用库(DPK/视觉控件)的程序。该库是在调试模式下编译的。这意味着优化是关闭的,范围检查是打开的,等等。库设置为“根据需要重建”。我不打算重新分发它(仅供内部使用)。

如果我在“发布”模式下编译我的程序会发生什么?库中包含的代码会自动重新编译为“发布”模式吗?或者我必须先加载 DPK 并在“发布”模式下重新编译我的库?


更新:
与“根据需要重建”相关,Embarcadero 的帮助说明了一切:“根据需要构建包”。我将其解释为“如果程序以发布模式编译,则需要重新编译库,因此我们将为您完成”。我的解释也……符合圣经吗?


该实验表明(在上述条件下)库中包含的代码将根据 DPR 的设置而不是 DPK 的设置编译成 EXE。

编译器在重新编译其 PAS 文件时不关心 DPK 文件(仅适用于未在 IDE 中加载 DPK 时)。**

所以这里是(易于在所有系统中重现)证明:让我们称我的程序 Prog.DPR(包含 Prog.pas)和我的库 Lib.DPK(包含 LibUnit.pas)。该库包含 TMyPanel 可视化控件。DPR 处于发布模式。DPK 处于调试模式。

I install the library. I exit the library ('Close all').
I load the DPR in IDE, I also load LibUnit (Attention: I load only the unit, not the DPK)
I put TMyPanel on my program's form.
The LibUnit is automatically added to the USES clause on my program.
I edit LibUnit. I compile. It works. New DCU file is generated for LibUnit.
I go to library's folder and I delete the DPK (and the Dproj) but I keep LibUnit.pas.
I edit LibUnit. I compile. Still works! New DCU file is generated for DCU file is generated for LibUnit.!!!!

问题是:如果没有关于如何编译 LibUnit 的信息(PDK 被删除),LibUnit 是如何编译的??????显然编译器使用了 DPR 的设置。这是“释放”模式。这意味着我的库作为“发布”集成到程序中。.

4

2 回答 2

5

在可执行文件中的调试和发布目标之间切换不会导致任何引用的运行时包被重建。

包有自己的选项,这些选项独立于使用它们的项目。这是唯一可能的设计选择。想象一下,如果你有一个包被另外两个项目 A 和 B 使用,比如说。现在,A 是为调试而构建的,但 B 是为发布而构建的。不能同时为两者构建包。

“根据需要重新构建”意味着如果最新版本相对于包的源已过时,则将重新构建包。


关于您的问题更新中的“实验”,您的 exe 很可能在运行时没有链接到包。相反,.pas 文件被直接编译并链接为您的 exe 项目的一部分。

于 2012-08-23T09:19:17.327 回答
0

该实验表明(在上述条件下)库中包含的代码将根据 DPR 的设置而不是 DPK 的设置编译成 EXE。

编译器在重新编译其 PAS 文件时不关心 DPK 文件(仅适用于未在 IDE 中加载 DPK 时)。**

所以这里是(易于在所有系统中重现)证明:让我们称我的程序 Prog.DPR(包含 Prog.pas)和我的库 Lib.DPK(包含 LibUnit.pas)。该库包含 TMyPanel 可视化控件。DPR 处于发布模式。DPK 处于调试模式。

  • 我安装库。我退出图书馆(“全部关闭”)。
  • 我在 IDE 中加载 DPR,我还加载了 LibUnit(注意:我只加载单元,而不是 DPK)
  • 我将 TMyPanel 放在我的程序表单上。
  • LibUnit 会自动添加到我的程序的USES 子句中。
  • 我编辑 LibUnit。我编译。有用。为 LibUnit 生成新的 DCU 文件。
  • 我去图书馆的文件夹,我删除了 DPK(和 Dproj),但我保留了 LibUnit.pas。
  • 我编辑 LibUnit。我编译。仍然有效!为 LibUnit 生成了新的 DCU 文件。为 LibUnit 生成了 DCU 文件。!!!!!!

问题是:如果没有关于如何编译 LibUnit 的信息(PDK 被删除),LibUnit 是如何编译的??????显然编译器使用了 DPR 的设置。这是“释放”模式。这意味着我的库作为“发布”集成到程序中。.

于 2013-02-08T16:33:01.880 回答