Unit <someunit>递归使用它自己(但它没有)</someunit>

时间:2011-04-07 17:21:32

标签: delphi delphi-2007

我有一个数据模块,用于我们的一系列业务应用程序。它位于项目中几乎每个单元的实现使用条款中。

我可以在数据模块的实现部分修改业务逻辑和其他代码,并且编译没有任何问题。但是,对数据模块的接口部分进行任何更改然后编译都会导致编译器错误“Unit MyDataModule递归使用自身”。构建而不是编译会使错误消失。

这是我以前从未见过的新作品。当然,我已经检查过以确保数据模块无法递归使用,如果它实际上是,那么构建不会改变任何东西。

有没有人对如何追踪或修复它有任何想法?每次在数据模块中引入新的查询或方法时,必须编译,关闭错误对话框然后构建,这真的很烦人。

编辑:解决以下一些评论和@ Marjan的回答:

我没有使用Variants或调试dcus。我在其中一个Google搜索结果中尝试了一个解决方案,该搜索结果显示promising有关损坏的.identcache或.local文件,但这并没有成功。

试过@Jørn的建议;清理了所有的临时编译.dcus,编译完成,一切都很顺利。对界面进行了更改(在数据模块的类声明的私有部分中声明了一个布尔变量),然后按Ctrl + F9进行编译。错误。一个Build,一切都很好。编译然后工作正常。删除布尔值,尝试编译:错误。

我有大约20个类似大小的项目(~750K-1M LOC),其中没有一个表现出这种行为。我已经四次检查数据模块不在项目中任何单元的接口部分。数据模块本身并不是非常大(从'unit'到'end。'总共有8,345行,包括注释和空行)。 .dfm,被视为文本,共有8,916行。

编辑2 :我想我必须接受(现在,无论如何)这是一个编译器故障。我将尝试重新安排一些事情,将一些功能分解为一个单独的数据模块,以查看它是否是一个大小限制(可能是DFM中的项目)或其他东西。感谢您的所有努力。

6 个答案:

答案 0 :(得分:11)

您正在遇到编译器故障。请参阅LKesslers问题:Why does adding Action cause Fatal Error in Delphi了解(a)发生这种情况的其他情况。

另一个:http://objectmix.com/delphi/633618-option-use-debug-dcus-causes-compiler-error.html与使用debug dcu相关。

如果你谷歌(http://www.google.com/search?q=delphi+%22recursively+uses+itself%22+compiler+error),它似乎已经存在了自D4 ......

我猜这是一个编译器故障并不是一种安慰,但至少你不是一个人......

<强>更新

我挖出了另外两个链接,其中包含可能的相关信息。然而,他们都在专家交流。我通常会 包含专家交流的链接,因为我不同意他们的作案手法(要求获得专家的资金)。在这个特殊的情况下,我考虑“作弊”(订阅,得到答案,在此发布并取消我的订阅),以帮助肯,大卫和其他任何受此问题折磨的人。但是,它感觉不对,即使我可以在他们开始向我收费之前取消,我也不会在订阅时放弃我的信用卡信息。

由于其他人可能对专家交流有不同的看法和/或可能非常热衷于做我不准备做的事情,所以链接是:http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_10206864.htmlhttp://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_23848477.html 这两个问题都标记为“已解决”和“提问者已验证”。无论这意味着什么。

答案 1 :(得分:2)

遇到同样的问题,但是,我的解决方案非常小,并且能够找到根:我尝试添加到现有项目的单元与我的项目具有相同的名称。重命名项目,结束了。

答案 2 :(得分:0)

一直在考虑它 Delphi可以将DCU放在与pas文件不同的文件夹中 如果编译期间的搜索顺序是片状的,它将首先找到DCU并使用接口部分,然后找到PAS文件并使用那里的实现。

如果强制DCU与PAS文件位于同一目录中,问题是否会消失?

答案 3 :(得分:0)

这是一个编译器故障,正如其他人所说,但我发现尝试使用您的库路径和搜索路径以及您组中每个项目内的DCU输出路径会很有帮助。简化搜索和库路径,并使用输出DCU路径,例如,确保每个项目将其DCU文件放在不在其他项目的搜索或库路径中的单独文件夹中。

重叠或复杂的搜索或库路径,以及特别是共享的DCU往往会带来这些问题。

答案 4 :(得分:0)

您是否尝试使用“-nocache”命令行参数运行Delphi?它解决了很多问题。我在Embarcadero论坛的某个地方找到了这个解决方案。

答案 5 :(得分:0)

我们遇到了同样的问题。它在修改一些不相关的文件后随机发生。

在我们的案例中,麻烦是:

  1. 某些文件(x.pas)在使用部分中有“commonUnit.pas” - 但它不需要它
  2. 修改“commonUnit.pas”或更好的“SomeConsts.pas”(whitch由commonUnit.pas使用,但不是由x.pas使用)
  3. 编译(有时)失败,消息“Unit commonUnit.pas递归使用自己”
  4. 重建项目修复问题
  5. 我们的项目环境是:

    • 一个“已编译”文件夹(首先包含在SEARCH路径中)
    • 所有 DCU都已编译到此文件夹