我有一个使用库的程序(DPK /可视控件)。该库是在调试模式下编译的。这意味着Optimizations为OFF,RangeChecking为ON等,库设置为“根据需要重建”。我不打算重新分发它(仅供内部使用)。
如果我在“发布”模式下编译程序会怎样?库中包含的代码将自动重新编译为“发布”模式?或者我必须加载DPK并首先在“发布”模式下重新编译我的库?
更新:
与“根据需要重建”相关,Embarcadero的帮助说明了一切:“根据需要构建软件包”。
我将其解释为“如果程序是在发布模式下编译的,则需要重新编译库,以便我们为您完成”。
我的解释也是......圣经吗?
此实验表明(在上述条件下)库中包含的代码将根据DPR的设置编译到EXE中,而不是DPK的设置。
编译器在重新编译其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的设置。这是'发布'模式。这意味着我的库已作为“发布”集成到程序中。
答案 0 :(得分:5)
在可执行文件中的调试目标和发布目标之间切换不会导致重建任何引用的运行时包。
包具有自己的选项,这些选项独立于使用它们的项目。这是唯一可能的设计选择。想象一下,如果你有一个被其他两个项目使用的包,比如A和B.现在,A是为调试而构建的,但是B是为了发布而构建的。无法同时为两者构建包。
“根据需要重建”意味着如果最新版本相对于软件包的来源过时,将重新构建软件包。
关于问题更新中的“实验”,您的exe很可能不会在运行时链接到包。而.pas文件正在直接编译并链接为exe项目的一部分。
答案 1 :(得分:0)
此实验表明(在上述条件下)库中包含的代码将根据DPR的设置编译到EXE中,而不是DPK的设置。
编译器在重新编译其PAS文件时不关心DPK文件(仅在未在IDE中加载DPK时适用)。**
所以这里是(易于在所有系统中重现)证明: 让我们调用我的程序Prog.DPR(包含Prog.pas)和我的库Lib.DPK(包含LibUnit.pas)。该库包含TMyPanel可视化控件。 DPR处于发布模式。 DPK处于调试模式。
问题是:如果没有关于如何编译LibUnit的信息(PDK被删除),LibUnit是如何编译的?显然,编译器使用了DPR的设置。这是'发布'模式。这意味着我的库已作为“发布”集成到程序中。