【问题标题】:"Cannot load package A, it contains unit X, which is also contained in package B"“无法加载包 A,它包含单元 X,它也包含在包 B 中”
【发布时间】:2025-12-12 22:40:02
【问题描述】:

(对我来说更多的包/组件安装乐趣——感谢大家迄今为止的所有帮助)。

我在 Delphi 2007 中将错误列为标题。包 A 是我的基于框架的“查看器面板”包。包 B 是一个包含几个组件的包,这些组件用于显示有关链接到 gven 数据库的数据集的信息(它们的 SQL、状态、类类型等),其中一个是非可视组件(我们称之为检查员)创建并调用显示该信息的表单。单位 X 是该表格的单位。

我将 Inspector 组件添加到 Package 中的一个查看器面板中,但已将其删除,并且在项目的 View Source 中找不到对它的任何引用,也无法在我添加的基于框架的查看器面板的单元中找到它到。引用隐藏在哪里?

另外,将 Inspector 组件添加到其中一个视图面板框架(也作为注册组件安装)会导致此问题吗?

这可能也与this previous questionthis one 有关,但我决定从这个特定的症状/问题重新开始,只是为了保持简洁明了,希望以后对其他人有用。提前感谢您的任何帮助。


更新:

感谢 Loren,我能够找到并删除保留并导致问题的 USES 引用。但是,我仍然不清楚如何完成我想要完成的事情。 : \ 这是最新的:

Inspector 是一个简单的非可视组件,它包含一个 DataSet 属性和一个内部“信息表单”。调用 ShowInfo 方法会创建表单,并使用与链接的 DataSet 相关的各种信息填充它。我想用它来调试驱动查看器的 SQL。

如上所述,Inspector 包含在包 B 中。查看器在包 A 中。我想在一些 TFrame 后代(注册为真正的调色板组件)上使用 Inspector 组件。当我将该组件放在给定的 TFrame 上以使用它并编译/安装包 A 时,我收到“无法加载包 A,它包含单元 X,它也包含在包 B 中”错误。现在很明显是原因所在,我可以按需重新创建问题。

moobaa 的以下建议是有道理的,但 似乎 即使我尝试按照他的建议执行方法 #2,它也不起作用。我错过了什么?看起来这应该是可行的,事实上,我见过的大多数软件包似乎一直都在使用其他已安装的软件包(包括 VCL 本身)。

注意:据我所知,包 B 不依赖于包 A(而且我已经单独安装了它,所以这似乎是一致的)。

(顺便说一句,是否有任何工具可以像这样“绘制”包依赖项?我使用的是 D2007)

一如既往,感谢您的时间和帮助。

【问题讨论】:

  • 在您的情况下,包 A 和 B 是什么?我得到了同样的错误:无法加载包'Abbrevia160'。它包含单元“AbDfBase”,该单元也包含在包“Abbrevia”中。 Abbrevia 和 Abbrevia160 是完全相同的软件包。 160 只是一个后缀......有什么想法吗?

标签: delphi packages custom-component


【解决方案1】:

也可能与this question有关。

单元 X 显然已链接到两个包中。有几种解决方法:

  • 使用 Unit X(以及任何其他依赖项)创建一个新包(我们将其称为包 C),然后将包 A 和包 B 更改为都使用包 C;或者...
  • 在包 B 中包含单元 X,并让包 A 使用包 B(这是第一个解决方案的更紧凑形式)。

如果在您的包 B 代码中明确提到了查看器,那么包 B 肯定应该使用包 A(ie,那里应该有一个明确的依赖关系)。如果没有明确指出共享代码,B 会将它自己的代码版本编译到 B 中,从而导致您看到的问题。

现在,如果该依赖关系正常,从包 B 中添加对包 A 的引用应该会立即解决此问题;毕竟,B 将“使用”包 A 中的代码,并且相同的单元不会被编译成两个包。但是,如果这引入了循环引用(我不记得 A 是否使用 B),那么您可能需要对 to 进行一些重构:}

【讨论】:

  • 谢谢。我现在不知道 Unit X 如何/在何处链接到 A (看似删除 Inspector 组件引用后)。有什么建议可以找出来吗?再次感谢。
  • 尝试使用 grep 搜索单元名称 - 正如 Loren 所提到的,并非使用子句中的所有引用都会自动删除。此外,请务必删除所有 dcu 和 dcp 文件(如 Marco 所述),然后全部重建。
  • moobaa -- 谢谢。我已经更新了带有更具体的因果症状的问题,并且非常感谢您可能拥有的任何其他想法/见解。到目前为止,非常感谢您的建议!
【解决方案2】:

仅仅因为您删除了组件并不意味着您从USES子句中删除了模块名称--这些不是自动删除的。

【讨论】:

    【解决方案3】:

    Loren:Requires 子句,因为它是一个 .dpk,你不能使用一个包 afaik。

    我只需清理 $(BDSDIR)/projects/ 目录,我自己的项目目录以删除 B.dcp 和 B 中单元的所有 dcu,然后重建 A。

    另一件事是检查是否有依赖于 B 的组件注册。

    【讨论】:

    • 有一个依赖于 B 的组件——Inspector 本身。但此时我没有看到对 A 中的 B 的任何直接引用(以单位使用,或在项目文件中需要)。还有其他地方可以检查吗?我会尝试 dcp 的建议。
    • 我的意思是一个单位被一个用途拉进来,它带来了他不想要的东西。