问题 “无法加载包A,它包含单元X,它也包含在包B中”


(更多包/组件为我安装乐趣 - 感谢大家为您提供的所有帮助)。

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

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

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

这很可能与此有关 这个上一个问题 和 这个 同样,但我决定从这个特定的symtpom /问题开始,只是为了保持简洁明了,希望以后对其他人有用。在此先感谢您的帮助。


更新:

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

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

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

moobaa的建议在下面是有道理的,但它 似乎 虽然我试图按照他的建议做出第二步,但它不起作用。我错过了什么?看起来这应该是可行的,事实上,我看到的大多数软件包似乎一直使用其他已安装的软件包(包括VCL本身)。

注意:据我所知,包B不依赖于包A(我已经单独安装它,因此似乎同意)。

(顺便说一句,是否有任何工具来“规划”这样的包依赖?我正在使用D2007)

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


1217
2017-07-28 02:08


起源

什么是套餐A和B在你的情况下?我得到同样的错误,上面写着:无法加载包'Abbrevia160'。它包含单位'AbDfBase',它也包含在'Abbrevia'包中。 Abbrevia和Abbrevia160是完全相同的包。 160只是一个后缀...任何想法? - ple103


答案:


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


3
2017-07-28 04:39





它也可能与之相关 这个问题

单元X显然与两个包都链接在一起。有几种方法可以解决这个问题:

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

如果您的Package B代码中明确提到了查看器,那么Package B肯定应该使用Package A(,那里应该有明确的依赖)。如果未明确指出共享代码的指示,B会将其自己的代码版本编译为B,从而导致您遇到的问题。

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


7
2017-07-28 02:19



谢谢。我不知道在这一点上单元X如何/在哪里被链接到A(看似删除Inspector组件参考)。有什么建议怎么说出来的?再次感谢。 - Jamo
尝试grep搜索单元名称 - 正如Loren所提到的,并非所有use子句中的引用都会被自动删除。另外,请务必删除所有dcu和dcp文件(如Marco所述),然后重建所有文件。 - moobaa
moobaa - 谢谢你。我已经更新了具有更具体因果症状的问题,并且非常感谢您可能拥有的任何其他想法/见解。非常感谢你的建议到目前为止! - Jamo


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

我只是清理$(BDSDIR)/ projects / dir,我自己的项目目录,删除B.dcp和所有dcu用于B中的单位,然后重建A.

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


0
2017-07-28 10:22



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