这个问题与32位编译器Delphi 10.2 Tokyo有关。
当我更改特定单元(A
)的接口时,第一次在unit B
中编译失败。当我重新运行编译时,它将继续进行(有时只有第三个编译有效)。如果我构建项目,或者删除所有.dcu
文件(我想只需要删除“坏”文件),那么一切都很好。对于手动编译来说,这不是一个大问题,但是自动编译可能会受到严重阻碍。很少有其他单元发生这种情况(导致该问题的第一个单元在进行一些更改后就停止了导致它的发生,但是很难说出哪个更改和在哪个文件中。)
使用多种编译方法会发生这种情况-直接在RAD Studio中,允许外部编译,并使用msbuild。
此消息失败:
[dcc32 Error] B(x): E2003 Undeclared identifier: 'Some_Class_From_Unit_A'
[dcc32 Error] B(y): E2003 Undeclared identifier: 'Other_Class_From_Unit_A'
[dcc32 Error] B(z): E2066 Missing operator or semicolon
...bunch of E2066 Missing operator or semicolon...
当我删除C.dcu
时,在unit D
中编译失败,缺少对unit E
的引用,但是直接编辑unit E
不会导致类似的编译失败。
所有单位仅按名称引用,路径位于.dproj
文件中。
源代码结构中有多个循环,但是没有interface-interface-interface多种(不应该编译,对吧?)。我需要一些有关寻找内容的准则。
我的理论:unit A
已更改,因此计划重新编译; unit B
使用unit A
,因此也计划将其重新编译; unit A
通常在unit B
之前进行编译,但编译器已决定unit B
首先(由于某些依赖周期); unit B
寻找已编译的unit A
,但还没有这样的东西-因此,unit A
中的符号被视为丢失。
我的理论正确吗?如果是这样,我们如何避免这个问题?我找不到执行某些编译顺序的方法。