我们的团队多年来一直使用Delphi 6,然后在2006年前切换到Delphi 2006。在这两个版本中,我们遇到以下问题:通常编译器会抱怨一个被推测为递归使用的单元。这个单位是一个40k LOC单位,是一个项目的核心,拥有近100万LOC(包括第三方)。不正确的循环参考错误
错误消息是不正确的:该项目的完整版本始终工作。不幸的是,这个错误信息并不能告诉我们所在的循环引用的位置,只是该单元的名称。有时甚至会发生有效的错误消息被列出2-4次,直到该循环引用问题被“找到”。很明显,编译器在这里以一个圆圈运行。由于该项目的大小,很难手动找到问题。因此,我制作了一个工具,其中证明确实没有循环引用(该工具会创建单元的定向依赖关系图并确定该图中的相关性组件 - 除了我故意放置某些内容外,没有其他功能)。
这不仅影响F9编译,而且代码完成/洞察力在大多数时间不工作。有时它工作时,我再次按Ctrl空间...
任何想法我们如何可以隔离甚至解决问题?请注意,将40k LOC单元拆分为较小的单元将非常困难,因为它包含大约15个大类,这些大类在接口部分相互依赖(我知道这很糟糕,但应该可以工作)。
更新
我们不断地重构,但是这是一个艰难的单位重构,因为一切都依赖于一切,几乎。一直试图通过接口绕过它,但我们正在谈论一些具有100多种方法和属性的类。它会更慢。
升级到D2009可能是一个可行的选择,但现在我们坚持使用D2006(unicode和价格标签是这里的两个瓶塞)。无论如何,如果问题有帮助的话,问题至少从D6开始就存在。
关于修剪使用条款,我们经常用Icarus来做这件事。但目前为止这并没有帮助。现在我们在接口部分下降到90个自定义单位。但是,对于真实的循环引用,问题可能出现在任何单元中。还尝试将所有单位添加到dpr。
该项目与其他项目共享很多代码,并且有一些IFDEF。但是,定义不是在项目选项中设置的,而是通过常用的包含文件。因此所有模块应该看到相同的定义。而且,在完全重建之后不久,问题又重新出现,而不切换到另一个项目。
对,我们在所有项目(和更多)的完整构建脚本中使用dcc32。我并不期望将其用作IDE编译的替代品;它不会帮助您了解代码洞察力,以及谁知道当时需要多长时间。 但也许这是一种诊断问题的方法?理想情况下,dcc32增量会遇到同样的问题,它的输出会触发一些想法... – 2009-05-25 18:53:01
是的,这正是我想要建议的,也许我没有成功通过明确说明:-(抱歉,使用dcc32应该看看哪些文件被编译了几次,并且在哪个文件之后它全部停止了。除非IDE编译器和dcc32真的不一样,但是这个我不会假设。 – mghie 2009-05-25 20:21:13