Delphi2010编译器错误:F2084内部错误:L1737

Delphi2010编译器错误:F2084内部错误:L1737,delphi,compiler-construction,Delphi,Compiler Construction,当我使用Delphi 2010试用版编译我们的项目时,有一个致命错误: [DCC致命错误]F2084内部错误:L1737 这似乎是内部错误。没有任何暗示 这是编译器错误还是试用限制 谢谢。我不能给你一个明确的答复。看看 编译器抱怨什么文件?你知道有什么问题吗?使用的任何新功能可能仍然有问题吗 编辑:我认为我们可以忘记试用期限制……这是一种非常奇怪的表示试用期结束的方式。不知道这一点,但这肯定是一个链接器错误(代码以L开头),而这些错误大多与函数或运算符重载有关。但是,这些也可能是由编译器错误引

当我使用Delphi 2010试用版编译我们的项目时,有一个致命错误:

[DCC致命错误]F2084内部错误:L1737

这似乎是内部错误。没有任何暗示

这是编译器错误还是试用限制


谢谢。

我不能给你一个明确的答复。看看

编译器抱怨什么文件?你知道有什么问题吗?使用的任何新功能可能仍然有问题吗


编辑:我认为我们可以忘记试用期限制……这是一种非常奇怪的表示试用期结束的方式。

不知道这一点,但这肯定是一个链接器错误(代码以L开头),而这些错误大多与函数或运算符重载有关。但是,这些也可能是由编译器错误引起的-例如,在一些较旧的Delphi版本中(当然是D5,我认为它在D7中得到了修复),当使用带有可选参数的重载构造函数时,会出现链接器错误。

我认为您使用的库路径与较旧的Delphi版本相同,因此,使用不兼容的DCU。

自Delphi 2009年以来,情况确实有所改善,但编译器中仍然存在一些与泛型相关的小故障,可能会导致类似这样的错误。检查您是否试图声明泛型类或方法,然后在异常情况下使用它们。如果是这样,请尝试将其提取为一个小的、可复制的测试用例,并将其报告给QC。

确保您的路径不会与旧版本的路径相冲突。
确保删除项目中使用的所有DCU,包括第三方组件(除非您有一些没有源代码的组件,在这种情况下,请仔细检查您是否有D2010的最新DCU),然后执行“全部生成”以重新生成所有这些组件。

然后试着把你的应用程序分成更小的部分,看看是哪一部分导致了问题:目标是拥有触发错误的最简单的应用程序,能够将它发送给Embarcadero,让他们有合理的机会找到问题……

最后,我发现了问题

我们使用了从Barry Kelly的博客中引入的一个StAMPPTR模式,D2010的编译器认为这是无效的。D2009中的smartptr单词也很好

非常感谢

顺便说一句,我在这里发布了我的smartptr:)我们地区仍然没有D2010可供销售:(

我不知道D2010编译器的实现发生了什么变化

type

  TSmartPtr<T: class> = class(TInterfacedObject, TFunc<T>)
  private
    FValue: T;
  public
    constructor Create(AValue: T);
    destructor Destroy; override;
    function Invoke: T;
  end;

  TSmartPtrArray<T: class> = array of TFunc<T>;


implementation

{ TObjectHandle }

constructor TSmartPtr<T>.Create(AValue: T);
begin
  FValue := AValue;
end;

destructor TSmartPtr<T>.Destroy;
begin
  if Assigned(FValue) then
    FValue.Free;
end;

function TSmartPtr<T>.Invoke: T;
begin
  Result := FValue;
end;
类型
TSmartPtr=类别(TInterfacedObject,TFunc)
私有的
f值:T;
公众的
构造函数创建(AValue:T);
析构函数销毁;重写;
函数调用:T;
结束;
tsmartprarray=TFunc的数组;
实施
{TObjectHandle}
构造函数tsmartpr.Create(AValue:T);
开始
f值:=有效值;
结束;
析构函数TSmartPtr.Destroy;
开始
如果赋值(FValue),则
自由价值;
结束;
函数TSmartPtr.Invoke:T;
开始
结果:=fv值;
结束;

由于过程中的泛型字典类型声明(如Atle所述),我遇到了相同的问题。将该类型声明移动到单元的实现部分顶部后,L1737错误消失。

此处出现了相同的错误。我之前删除了该错误:

interface

type
  TBoolFunction = reference to function: Boolean;

我不得不将其他本地“引用…”结构从另一个单元移动到接口来修复它。

这意味着您的代码太复杂了-任何大小超过某个阈值(10k行左右)的文件都会出现这些问题-另一个是“使用不同版本的x编译”错误


尽管在delphi中,通常都说相关代码保持在同一个单元中,但它并没有扩展到尽可能大的程度,因此忽略它并尽可能多地分解。

这里的一个代码片段会有所帮助。情况可能并不总是这样,但在delphi 2010中,生成ICEs需要超过一个片段大小的代码量。真的不知道在这里粘贴什么代码吗:(只知道如果我删除DPR源中的MainForm Create,它就可以编译。似乎是TMS组件导致了错误,但这些组件已经真正构建到IDE中并且已经工作了。我试着像你说的那样,似乎是一些ui组件导致了这一点。因为如果我删除了Application.CreateForm(TFrmMain,FrmMain),它只是工作。我们使用旧版本的TMS组件,我们的主窗体上的VirtualTree。我修改了源代码,使它们可以与D2010一起工作。可能是问题。那里没有任何旧的DCU,我们彻底清理了它们。