由于fpc trunk一直在增强及调整,用不同时间段的fpc都可能存在兼容问题,如这次用fpc trunk(3.3.1) 编译TMS FNC控件时出现Internal 20231102,之前的能通过编译的。用最新的fpc编译LCLTMSFNCCorePkg.lpk时出现以下错误:
在fpc源码发现以下一段文字:如果使用泛型等复杂的情况下,localsymtable为nil也可能会出现,但仍然会产生有效的代码,为了允许在这种情况下继续,可以定义SKIP_INTRAL20231102跳过就可以。
if pu.u.in_interface then begin { MVC: The case where localsymtable is also nil can appear in complex cases and still produce valid code. In order to allow people in this case to continue, SKIP_INTERNAL20231102 can be defined. Default behaviour is to raise an internal error. See also https://gitlab.com/freepascal.org/fpc/source/-/issues/40502 } {$IFDEF SKIP_INTERNAL20231102} if (pu.u.localsymtable<>Nil) then {$ELSE} if (pu.u.localsymtable=Nil) then internalerror(20231102); {$ENDIF} symtablestack.push(pu.u.localsymtable); end else internalerror(200705153)
解决方法:
打开\fpcsrc\compiler\fpcdefs.inc
添加定义:{$define SKIP_INTERNAL20231102}
{$mode objfpc} {$asmmode default} {$modeswitch advancedrecords} {$H-} {$goto on} {$ifndef DISABLE_INLINE} {$inline on} { Inline small functions, but not when EXTDEBUG is used } {$ifndef EXTDEBUG} {$define USEINLINE} {$endif EXTDEBUG} {$endif} {$interfaces corba} //复杂的泛型跳过INTRAL20231102过 //在复杂的情况下,localsymtable也为nil的情况可能会出现,但仍然会产生有效的代码。 //为了允许在这种情况下继续,可以定义SKIP_INTRAL20231102。 {$DEFINE SKIP_INTERNAL20231102} { This reduces the memory requirements a lot } {$PACKENUM 1} {$PACKSET 1} { We don't use exceptions, so turn off the implicit exceptions in the constructors } {$IMPLICITEXCEPTIONS OFF}
修改后重新编译fpc(我用fpcupdeluxe重新编译fpc),fpc编译完成后,在lazarus就可以编译tms fnc控件包(LCLTMSFNCCorePkg.lpk)。
这个方法不一定是最佳方案,如您有更好的方法也请与我分享,谢谢!
标签:控件,TMS,fpc,localsymtable,SKIP,编译,trunk From: https://www.cnblogs.com/qiufeng2014/p/18585733