秋·风

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
由于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等原来编译出错的控件现在已可以正常安装。
这个方法不一定是最佳方案,如您有更好的方法也请与我分享,谢谢!

 

 

 

posted on 2024-12-04 10:12  秋·风  阅读(63)  评论(0编辑  收藏  举报