Delphi包装问题:包装单位必须仅参考包装单位..(E2411)

时间:2011-09-08 19:17:01

标签: delphi compiler-errors delphi-xe

我得到的错误是这样的:

[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

我需要知道我遇到的这个错误究竟意味着什么,如果可能的话,如何解决和解决这些问题,特别是当错误信息中陈述的事实不正确时(单位实际上指的是其他单位)其他有效的包裹。)

此类问题涉及包依赖性。我遇到了一个有趣的问题,一系列的三个设计时和三个运行时包就像这样:

enter image description here

最奇怪的是,每次清理和重建时,我都会在错误中获得不同的单位名称。 (上面显示为XBAT单位是指单位QBEE)。

另一个奇怪的是它指的是处于顶级依赖关系的单元,并且是已经构建的包的一部分。

步骤;

  1. 编译A,它有效。
  2. 编译A_Dsgn,它有效。
  3. 编译B,它可以工作。
  4. 编译B_Dsgn,它有效。
  5. 编译C,它因E2411错误而失败。
  6. 因为我怀疑任何人都可以告诉我如何解决这个问题,我正在寻找解决包中复杂依赖问题的步骤。上述错误的字面含义表明,例如,我应该有一个关于隐式链接单元的相应消息,我没有。我已将所有隐式使用的单元添加到基础包A和B中,因此不会发生隐式单元警告。

    我的下一个想法是分离每个包的DCU输出文件夹,以防止一个DCU输出混淆编译器。现在我甚至无法构建软件包。

    更新我尝试使用Explicit RebuildRebuild as Needed选项。我发现此错误与启用“需要重建”有关。当它关闭时,软件包会因其他错误而失败,这些错误更重要。我发现奇怪的是,编译器会发出可以通过关闭Rebuild as needed来禁用的奇怪错误。有什么想法发生了什么?

    更新2 打开或关闭显式重建无法解决基本的基础问题。我得到了令人讨厌的运行时/设计时包问题,而不是出现这个错误,导致一组无法同时加载的包。 (无法加载包foo,因为它包含单元栏,它也在包bat中。你想在下次加载项目时尝试加载这个包吗?)。

4 个答案:

答案 0 :(得分:7)

我怀疑这是一个模糊的编译器错误。

我经历过的项目至少有4个级别的依赖运行时包:

PackageA< - PackageB< - PackageC< - PackageD

  

包装中的E2411单位'%s'指的是单位'%s',而不是   在任何包装中找到。打包单位必须仅指包装单位。

我发现唯一有效的解决方案是创建包A,B和C永不构建(即显式构建)包,并使用Project Dependencies来强制执行构建顺序。我不得不让所有三个永不建立或我会得到

  

E2220永不建立包'%s'需要始终构建包'%s'

我知道它可能不是您正在寻找的答案,但它确实存在。

是的,这在Delphi 2009中发生在我身上。

答案 1 :(得分:2)

这很简单:如果C中的单元指的是不在包C引用的任何包中的单元,那么该单元应该包含在C中,或者可以在其中找到它的包。如有必要,将设备放入自己的包装中。

您放置哪个单元取决于依赖项。像你一样绘制它是有意义的,但具有单位级别的分辨率。

更新

您的更新1和更新2仍然让我觉得您的某个单元使用的单元(直接或间接)未正确引用。甚至可能是RTL或VCL单元。既然你有设计包,我假设你有组件。

IME,要包含的最小程序包集合是

requires
  rtl,
  designide,
  vcl,
  vclactnband,
  vclx,
  xmlrtl;

答案 2 :(得分:1)

在项目中,必须根据需要添加错误。 dcp错误。

在你的情况下:

[DCC致命错误] myunit3.pas(244):E2411包装中的单位B_Dsgn XBAT指的是任何包装中都找不到的单位QBEE。必须仅将打包单元引用到打包单元

在myunit3.pas驱动器的包中,添加所需的内容:QBEE

至少我设法这样做了。

答案 3 :(得分:0)

您正在使用 XBAT 单元中的 QBEE 单元,在这种情况下,您有四个选择:

1-您没有在软件包 B_Dsgn 包含列表中添加 QBEE

2-如果另一个软件包中已经包含 QBEE ,可以将其称为 Original_Package ,那么您应将软件包添加到要求中的< strong> B_Dsgn 并且不包含单位。

3- 原始包装具有

{$IMPLICITBUILD ON}

在它的dpk文件中,因此首先要做的是关闭IMPLICITBUILD并构建 Original_Package ,然后再构建您的 B_Dsgn 软件包。< / p>

4-您可能在 B_Dsgn 中没有 XBAT ,但是您在另一个中间包中将其称为 B_Run B_Dsgn 的要求列表中的 B_Run ,在这种情况下,请先尝试使用前三个选项之一修复 B_Run ,然后再构建它您可以构建 B_Dsgn

注意:

  • 可以用一长串的单元复制最后两种情况,而不仅仅是需要彼此使用的两个或三个程序包,在这种情况下,所有程序包都应关闭IMPLICITBUILD
  • 在构建它们之前,先对影响该问题的每个软件包的代码进行清理。

祝你好运