Never-build package 被编绎的包名 requires always-build package 另一个包名

11 views
Skip to first unread message

电脑玩家

unread,
Aug 21, 2009, 3:36:48 AM8/21/09
to 挨踢技术
问题:
我自己写了个控件,里面有 EhLib 的控件。

我做了个 DPK 把这个控件的 source 加进去,然后编译这个 dpk,然后它自动把 EhLib 的 Ehlib70.dcp 加到
DPK 包里去。然后编译出错,提示:

Never build package 'pcplayer' requires always-build package 'Ehlib70'

问题是,Ehlib70 这个包我已经安装到 Delphi 里了。它这个错误提示是什么意思?

----------- 解释 ----------------

两个BPL包,如果A包requires B包,那么A包与B包的Build Control 必须一致,或者A包为Rebuild as
needed(Always-build),B包为Explicit rebuild(Never-build)。原因是:如果A包为
Explicit rebuild,B包为Rebuild as needed,就是说A包是很稳定的,不需要编译,但A包requires的B包却是
常变的,要经常编译的。那么,当B包改变的时候,理应要更新,而A包是Explicit rebuild,所以A包还是不编译,那么造成A包的内容是旧
的,最终造成包的更新失败,如果,当应用程序调用A包的时候,就出错了。所以在A包 requires B包的情况下,不允许出现“A包为
Explicit rebuild,B包为Rebuild as needed”这种组合。Delphi就提示Never-build
package 'a' requires always-build package 'b'这个Error了。

这是程序包的互相依赖是的问题,假如程序包A依赖程序包B,如果B改变了A如何办?这就看你在编译程序包时候的Build Control如何选
择,如果选择Rebuild as needed那么这个包所依赖的任何单元只要一个改变它就会重新编译,如果选择Explicit
rebuild那么只有你选择重编译时候才会重建,一般情况下程序包比较稳定所以一般都选择这个选项。你这种情况就是B选择了Rebuild
as need,A选择了Explicit rebuild,这样B依赖的单元一改变B就被重建,但A间接依赖B所依赖的单元不被重建不符合逻
辑,所以编译器禁止这样做,你只要把所有的程序包都设置为Explicit rebuild就可以了

----------- 操作 ------------
在 D7 里 IDE 里,打开 DKP 后,选择菜单 Project - Options,打开对话框,选择 Description 页,找到
Build control 项目,有两个选择:
1. Rebuild as needed;
2. Explicit rebuild.

看到我的这个 DPK 是选择的2,手动改选择为1,安装通过。

Reply all
Reply to author
Forward
0 new messages