我们的团队多年来一直使用Delphi 6,然后在2006年转为Delphi.对于这两个版本,我们遇到以下问题:编译器经常抱怨一个假定递归使用的单元.这个单位是一个40k的LOC单位,是一个项目的核心,拥有近100万LOC(包括第三方).
错误消息不正确:项目的完整版本始终有效.不幸的是,错误消息并没有告诉我们假定的循环引用在哪里,只是该单元的名称.有时甚至会发生有效的错误消息列出2-4次,直到“找到”循环引用问题.很明显,编译器在这里运行一个圆圈.由于该项目的大小,很难手动找到问题.因此,我创建了一个工具,证明确实没有循环引用(该工具创建单元的有向依赖图并确定该图中的相干成分 – 除非我故意将其中一些放入,否则没有.)
这不仅会影响F9编译,还会影响大部分时间都无法正常工作的代码完成/洞察.有时当我第二次按下ctrl-space时它会起作用…
我们如何隔离甚至解决问题的任何想法?请注意,将40k LOC单元拆分成较小的单元是非常困难的,因为它包含大约15个在接口部分相互依赖的大类(我知道它很糟糕,但无论如何都应该工作).
更新
我们不断进行重构,但这是重构的一个难点,因为一切都取决于一切,差不多.一直试图通过接口绕过它,但我们正在讨论一些具有100种方法和属性的类.它会慢一些.
升级到D2009可能是一个选择,但现在我们仍然坚持使用D2006(unicode的东西和价格标签是这里的两个塞子).问题是无论如何它是否会有所帮助,因为问题至少存在于D6之后.
关于修改使用条款,我们经常与伊卡洛斯这样做.但到目前为止这没有任何帮助.我们现在在界面部分减少了90个自定义单位.但是,通过真正的循环引用,问题可能出在任何单位.还尝试将所有单元添加到dpr.
该项目与其他项目共享大量代码,并且有一些IFDEF.但是,定义不是在项目选项中设置的,而是通过公共包含文件设置的.因此,所有模块都应该看到相同的定义.此外,问题在完全重建后不久就会重新出现,而不会切换到另一个项目.