由于fpc trunk一直在增强及调整,用不同时间段的fpc都可能存在兼容问题(特别是泛型),之前能编译通过的控件,用最新的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 FNC/Codebot.Cross等原来编译出错的控件现在已可以正常安装。
这个方法不一定是最佳方案,如您有更好的方法也请与我分享,谢谢!