我得到的错误是这样的:
[DCC Fatal Error] myunit3.pas(244): E2411 Unit XBAT in package B_Dsgn refers to unit QBEE which is not found in any package. Packaged units must refer only to packaged units
我需要知道我遇到的这个错误确实意味着什么,如果可能的话,如何排除故障并解决这些问题,特别是当错误消息中陈述的事实不正确时(单位实际上指的是其他有效包中的其他单位) )。
这些问题涉及包依赖性。我有一个有趣的问题,一系列的三个设计时和三个运行时包相关如下:
最奇怪的是,每次清理和重建时,我都会在错误中获得不同的单位名称。 (上面显示为XBAT单位是指单位QBEE)。
另一个奇怪的事情是它指的是处于顶级依赖关系的单元,并且是已经构建的包的一部分。
脚步;
因为我怀疑任何人都可以告诉我如何解决这个问题,我正在寻找解决包中复杂依赖问题的步骤。上述错误的字面含义表明,例如,我应该有一个关于隐式链接单元的相应消息,我没有。我已将所有隐式使用的单元添加到基础包A和B中,因此不会生成隐式单元警告。
我的下一个想法是为每个包分离DCU输出文件夹,以防止DCU输出混淆编译器。现在我甚至无法构建软件包。
更新我尝试使用Explicit Rebuild
和Rebuild as Needed
选项。我发现此错误与启用“需要重建”有关。当它关闭时,软件包会因其他错误而失败,这些错误更重要。我发现编译器发出可以通过关闭Rebuild as needed
来禁用的奇怪错误很奇怪。有什么想法发生了什么?
更新2通过打开或关闭显式重建无法解决基本的基础问题。我得到了令人讨厌的运行时/设计时包问题,而不是出现这个错误,导致一组无法同时加载的包。 (无法加载包foo,因为它包含单元栏,它也在包bat中。你想在下次加载项目时尝试加载这个包吗?)。
我怀疑它是一个模糊的编译器错误。
我经历过的项目至少有4级依赖运行时包:
包< - 包< - 包< - 包
E2411 PackageD中的单元'%s'是指在任何包中都找不到的单元'%s'。打包单元必须仅指包装单元。
我发现唯一有效的解决方案是创建包A,B和C永不构建(即显式构建)包,并使用Project Dependencies来强制执行构建顺序。我不得不让所有三个永远不会建立,否则我会得到
E2220从不构建软件包'%s'需要始终构建软件包'%s'
我知道它可能不是您正在寻找的答案,但它确实存在。
顺便说一句,这在Delphi 2009中发生在我身上。
这很简单:如果C中的单元指的是不在包C引用的任何包中的单元,那么该单元应该包含在C中,或者可以在其中找到它的包。如果需要,将装置放在自己的包装中。
你把哪个单位依赖于依赖关系。像你一样绘制它是有意义的,但具有单位级别的分辨率。
您的更新1和更新2仍然让我觉得您的单位中有一个单位使用(直接或间接)未正确引用。甚至可能是RTL或VCL单元。既然你有设计包,我假设你有组件。
IME,包含的最小包装集合
requires
rtl,
designide,
vcl,
vclactnband,
vclx,
xmlrtl;
在项目中,必须根据需要添加错误。 dcp错误。
在你的情况下:
[DCC致命错误] myunit3.pas(244):包中的E2411单元B_Dsgn XBAT指的是任何包中都找不到的单元QBEE。必须仅将打包单元引用到打包单元
在myunit3.pas驱动的包中,添加所需的:QBEE
至少我设法这样做了。
您在XBAT单元中使用QBEE单元,在这种情况下,您有四个选项:
1-您没有将QBEE添加到Package B_Dsgn中的包含列表中。
2-如果QBEE已经包含在另一个包中,我们将其称为Original_Package,那么您应该将包添加到B_Dsgn中的需求列表中而不包含该单元。
3- Original_Package有
{$IMPLICITBUILD ON}
在它的dpk文件中,所以首先要做的是关闭IMPLICITBUILD
并构建Original_Package,之后你可以构建你的B_Dsgn包。
4 - 你可能在B_Dsgn中没有XBAT,但你在另一个中间包中有它让我们称之为B_Run并且你在B_Dsgn的需求列表中有B_Run,在这种情况下首先尝试使用上面三个选项中的一个来修复B_Run然后构建它,之后你可以构建B_Dsgn。
注意:
IMPLICITBUILD
。祝好运