无法加载包A,因为它包含单元X,而该单元也包含在包B中。

14

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

我在 Delphi 2007 中遇到了标题中列出的错误。 Package A 是我的基于框架的“查看器面板”包。 Package B 是包含用于显示与给定数据库链接的数据集相关信息(它们的 SQL、状态、类类型等)的一些组件的包,其中一个是非可视组件(我们将其称为 Inspector),它创建并调用一个显示该信息的窗体。X 单元是该表单的单元。

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

此外,是什么导致将 Inspector 组件添加到一个视图面板框架中(这也被安装为注册组件)会导致这个问题呢?

这可能与这个之前的问题以及这个问题有关,但我决定从这个具体的症状/问题开始重新开始,只是为了保持简洁和清晰,并希望对以后的某个人有用。提前感谢所有的帮助。


更新:

由于 Loren 的帮助,我找到并删除了仍然存在且导致问题的 USES 引用。但是,我仍然不清楚如何实现我想要的目标。 :\ 最新情况如下:

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

如上所述,检查器包含在B包中,而观察者则在A包中。 我想在一些TFrame后代上使用检查器组件(这些后代被注册为真正的调色板组件)。 但是,当我将该组件拖放到给定的TFrame上以使用它,并编译/安装A包时,我会收到“无法加载包含单元X的A包”错误。 现在很明显是原因,我可以按需重新创建问题。
moobaa在下面的建议很有道理,但是即使我试图执行他建议的第二种方法,它似乎也不起作用。 我错过了什么吗? 这似乎应该是可行的,实际上似乎大多数我见过的包都经常使用其他已安装的包(包括VCL本身)。
注意:就我所知,B包不依赖于A包(我已经单独安装了它,因此似乎达成了一致)。
(顺便说一句,有没有工具可以“绘制”出这样的包依赖项?我在使用D2007)
感谢您的时间和帮助。

在您的情况下,Package A和B是什么?我遇到了相同的错误,内容为:“无法加载包'Abbrevia160'。它包含单元'AbDfBase',该单元也包含在包'Abbrevia'中。Abbrevia和Abbrevia160是完全相同的包。 160只是一个后缀...有什么想法吗? - ple103
3个回答

9

这也可能与这个问题有关。

Unit X 明显被链接到两个包中。有几种方法可以解决这个问题:

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

如果在 Package B 代码中明确提到了 viewers,则 Package B 绝对应该使用 Package A(即应该存在明确的依赖关系)。如果没有明确说明共享的代码,B 将把自己的版本编译到 B 中,导致出现您看到的问题。

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


谢谢。目前我还没有找到Unit X是如何/在哪里与A链接的(似乎已经删除了Inspector组件引用)。有什么建议可以找出来吗?再次感谢。 - Jamo
尝试使用grep搜索单元名称 - 正如Loren所提到的,不是所有用途子句中的引用都会自动删除。此外,请确保删除所有dcu和dcp文件(正如Marco所提到的),然后重新构建所有内容。 - moobaa
moobaa -- 谢谢你的回复。我已经更新了问题,提供了更具体的因果症状,并非常感谢您可能拥有的任何其他想法/见解。到目前为止,非常感谢您的建议! - Jamo

4

仅仅因为你删除了组件并不意味着你从USES子句中删除了模块名称,它们不会被自动删除。


0

Loren:由于它是一个.dpk文件,所以你不能使用USES包。

我会简单地清理$(BDSDIR)/projects/目录和我的项目目录,删除B.dcp和所有dcu文件中的B单元,然后重新构建A。

另外要检查的一件事是是否有一个依赖于B的组件已经注册。


有一个组件依赖于B - 检查器本身。但是我目前没有看到A中对B的直接引用(在单元中使用或在项目文件中要求)。还有其他地方可以检查吗?我会尝试dcp建议。 - Jamo
我的意思是一个单元正在被一个使用它的模块引入了一些他不想要的东西。 - Loren Pechtel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接