【问题标题】:Delphi Internal Error when compiling a DPK Project编译 DPK 项目时的 Delphi 内部错误
【发布时间】:2016-08-25 13:50:53
【问题描述】:

我有一个 DPK 项目,它有时会在编译(到 Delphi IDE)时显示错误(“内存不足”),有时它会成功编译。 但是,当我尝试通过MSBUILD 编译它时,它总是抛出这个错误消息:

错误 F2084:内部错误:AV004A784A-WFFFD3764-1

有人有办法解决吗?

【问题讨论】:

    标签: delphi compiler-errors delphi-xe3


    【解决方案1】:

    这样的内部错误是编译器错误。我们无法解决它们,只有编译器开发人员才能解决。您需要向 Embarcadero 提交错误报告。鉴于 XE3 的年代久远,您不太可能得到修复。

    现代版本的 Delphi 不太容易出现内存不足故障,因此如果可以选择升级,那么这样做可能会避开问题。

    如果升级不是一种选择,那么每次遇到这些错误之一时,您可能不得不继续得过且过和诅咒。

    【讨论】:

      【解决方案2】:

      这实际上很常见(至少我经常遇到这类错误)。我确实采用了从 DPK 中逐步删除源代码文件的方法,直到编译成功。这样你也能看到是哪个文件导致了这些错误,然后一步一步注释掉这个文件中的源代码部分,直到你找到有问题的行,然后重写它(你需要以什么方式找出自己)。

      【讨论】:

        【解决方案3】:

        正如 David Heffernan 已经说过的,没有办法真正解决它,因为错误是编译器或链接器内部的,只有这些开发人员才能消除该错误。

        但通常有一些解决方法。

        根据我的经验,此类内部错误通常与泛型和匿名方法有关,或者与内联代码有关,尤其是当其中两个或所有这些结合在一起时。

        因此,找出您在内部错误发生之前所做的代码更改。如果您使用版本控制系统或 Delphi 的内部 _history 系统,请恢复到以前的版本,直到错误消失。然后你可以对你的“违规”代码做一个改变,看看是哪个代码导致了内部错误。

        通常,过于复杂的表达式(尤其是我上面提到的类型)会导致内部错误。如果是这种情况,请尝试通过首先计算子表达式来简化表达式。此外,不要使用像

        这样的临时通用声明
        x := TList<SomeType<Integer>>.Create;
        

        你应该尝试使用预定义的类型:

        type
          SomeTypeInteger = SomeType<Integer>;
          SometypeList = TList<SomeTypeInteger>;
        
          ...
        
          x := SometypeList.Create;
        

        换句话说,

        • 尝试通过追溯历史直到它消失来找到“违规”代码
        • 一旦你找到它,试着简化那段代码。解开表达式并预定义类型
        • 尝试用不同的方式表达代码,直到错误消失

        如果您这样做,您可能会成功避免内部错误。它经常花费我一些时间,但我总能找到一种方法来实现我想要的。如果不能,请在此处询问具体错误(通过发布有问题的代码、确切的错误,如果可能,请提供Minimal, Complete, and Verifiable example)。

        幸运的是,这些错误在最新的编译器中变得非常罕见。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-20
          • 1970-01-01
          • 1970-01-01
          • 2010-11-03
          • 2014-01-14
          • 2013-03-04
          • 2021-04-28
          • 2017-03-14
          相关资源
          最近更新 更多