首页 > 其他分享 >lazarus交叉编译riscv64应用时编译出错取巧处理方法

lazarus交叉编译riscv64应用时编译出错取巧处理方法

时间:2024-09-12 09:37:18浏览次数:9  
标签:riscv64 FormEditingHook 取巧 DesignerBaseClassId 编译 lazarus Result NewCollection

lazarus交叉编译riscv64应用时自带的memdataset/lazreporr等控件如果使用到formeditingintf.pas时链接时出现出类以下提示的错误:

这是fpc引起的问题,也提交给lazarus/fpc官方,不知道啥能修复(希望官方最快修复这个Bug)。
以下是网友英分享的修复方法(但本方法部分控件还存在链接问题),常用的控件已可正常编译运行,基本满足用lazarus编写riscv64的应用需求。
1、打开lazarus\components\ideintf\unitresources.pas
添加红色代码部位

class function TCustomLFMUnitResourceFileFormat.DefaultComponentClass: TComponentClass;
begin
  {$if defined(cpuriscv64) }
  Result:=nil;
  {$else}
  Result := FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TForm];
  {$endif}
end;

class function TCustomLFMUnitResourceFileFormat.FindComponentClass(
  aClassName: string): TComponentClass;
begin
  {$if defined(cpuriscv64) }
      Result:=nil;
  {$else}
  if CompareText(aClassName,'TForm')=0 then
    Result:=FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TForm]
  else if CompareText(aClassName,'TFrame')=0 then
    Result:=FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TFrame]
  else if CompareText(aClassName,'TDataModule')=0 then
    Result:=FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TDataModule]
  else
    Result:=nil;
  {$endif}
end;

2、打开lazarus\components\ideintf\collectionpropeditform.pas
添加红色代码

procedure TCollectionPropertyEditorForm.SelectionChanged(NewOwnerPersistent: TPersistent);
var
  AGrid: TOICustomPropertyGrid;
  AEditor: TPropertyEditor;
  NewCollection: TCollection;
begin
//  DebugLn('TCollectionPropertyEditorForm.SelectionChanged Old: ', DbgSName(OwnerPersistent), ' New: ', DbgSName(NewOwnerPersistent));
  {$if not defined(cpuriscv64) }
  AGrid := FormEditingHook.GetCurrentObjectInspector.GridControl[oipgpProperties];
  {$endif}
  AEditor := AGrid.PropertyEditorByName(PropertyName);
  if not Assigned(AEditor) then Exit;
  NewCollection := TCollection(AEditor.GetObjectValue);
  if NewCollection = nil then
    raise Exception.Create('NewCollection=nil');
  SetCollection(NewCollection, NewOwnerPersistent, PropertyName);
end;

3、打开lazarus\components\ideintf\formeditingintf.pas
添加红色代码:

{
 *****************************************************************************
  See the file COPYING.modifiedLGPL.txt, included in this distribution,
  for details about the license.
 *****************************************************************************

  Author: Shane Miller, Mattias Gaertner

  Abstract:
    Methods to access the form editing of the IDE.
}
unit FormEditingIntf;

{$mode objfpc}{$H+}

interface

uses
  Classes, TypInfo, types, Math,
  // LCL
  LCLClasses, Forms, Controls,
  // LazUtils
  CompWriterPas, LazLoggerBase,
  // IdeIntf
  ComponentEditors, ObjectInspector, UnitResources;
  
const
  ComponentPaletteImageWidth = 24;
  ComponentPaletteImageHeight = 24;
  ComponentPaletteBtnWidth  = ComponentPaletteImageWidth + 3;
  ComponentPaletteBtnHeight = ComponentPaletteImageHeight + 3;
  DesignerBaseClassId_TForm = 0;
  DesignerBaseClassId_TDataModule = 1;
  DesignerBaseClassId_TFrame = 2;
  NonControlProxyDesignerFormId = 0;
  FrameProxyDesignerFormId = 1;
{$if not defined(cpuriscv64) }

type
  TDMCompAtPosFlag = (
    dmcapfOnlyVisible,
    dmcapfOnlySelectable
    );
  TDMCompAtPosFlags = set of TDMCompAtPosFlag;

  TDesignerMediator = class;

  INonFormDesigner = interface
  ['{244DEC6B-80FB-4B28-85EF-FE613D1E2DD3}']

移到最后添加红色代码

procedure TDesignerMediator.GetObjInspNodeImageIndex(APersistent: TPersistent;
  var AIndex: integer);
begin

end;

initialization
  IsFormDesign := @IsFormDesignFunction;
{$endif}
end.
    

最后重新编译lazarus(不重新编译也没问题)
这是用unidac+sqlite编译的Demo:

 

标签:riscv64,FormEditingHook,取巧,DesignerBaseClassId,编译,lazarus,Result,NewCollection
From: https://www.cnblogs.com/qiufeng2014/p/18409553

相关文章

  • Jenkins 编译 .NET 6 WPF
    最近公司需求要将产品编译自动化,干了那么多年客户端开发一直都是小作坊作业最近换了一个比较正规的互联网公司一切都需要标准化流程化了,自动化也必不可少!然后我就了解到了Jenkins这玩意,找了两天资料感觉还挺简单的写篇文章收录下。因为签名UKey只要windows驱动,所以我只能将环境......
  • gcc / g++ 编译的区别
    今天在群里聊天的时候突然发现自己叫不清楚gcc/g++这两个东西。于是学习并且进行总结分享一下。GCC:GNUCompilerCollectionGNU编译器集合。那么GNU又是什么呢?是一个操作系统!具体涉及到一些历史知识和开源运动,放入下面的链接里啦https://www.gnu.org/home.zh-cn.html所以......
  • rsync 学习笔记(一)编译
    一、背景 rsync二进制程序依赖外部库,由于安全问题,有时会单独升级依赖的外部库。另外为了防止因为栈溢出攻击导致服务器被黑,需要对rsync及其依赖的外部库重新编译,开启安全编译选项,增加黑客破解的复杂度。 所有的库编译必须要求加上如下编译选项:栈保护(-fstack-protector-al......
  • 痞子衡嵌入式:在MDK开发环境下自定义安装与切换不同编译器版本的方法
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在MDK开发环境下自定义安装与切换不同编译器版本的方法。KeilMDK想必是嵌入式开发者最熟悉的工具之一了,自2005年Arm公司收购Keil公司之后,MDK就走上了发展快车道,从v2.50a一路狂奔到现在最新的v......
  • 使用dnSpyEx对.NET Core程序集进行反编译、编辑和调试
    前言说到.NET相关的反编译工具大家脑海里第一个想到的工具是什么?ILSpy、dnSpy、还是dotPeek?咱们今天的主要内容是讲讲dnSpyEx(dnSpyEx是dnSpy项目的非官方Fork维护版本)这个开源的.NET程序集反编译、编辑和调试工具该如何使用。4款免费且实用的.NET反编译工具.NET反编译神器ILSpy怎么......
  • 最快最简单的使用gcc编译stm32
    在Windows下最快最简单的使用gcc编译stm32在Windows下使用gcc编译stm通常需要许多准备工作minGW(编译c文件)gcc-arm-none-eabi(翻译到arm)make(编译链接的工具)makefile(该项目编译链接的规则)如果想快捷的尝试使用gcc编译编译出软件并运行的话,我推荐一个简单快速的方案......
  • openwrt编译带源码信息的linux内核版本遇到的错误
    1、在openwrt的根目录中可以执行如下命令:makemenuconfig打开CONFIG_DEBUG选项就会生成待调试信息的内核版本2、在openwrt的根目录中可以执行如下命令:makekernel_menuconfig打开CONFIG_DEBUG_INFO也会生成待调试信息的内核版本问题描述:在gcc7.5.0和gdb8.1.1的环境中编译出来......
  • 编译器与解释器:核心差异与实际应用
    目录1.编译器:从源代码到机器代码2.解释器:即时执行3.联系:代码的执行4.区别:性能与灵活性5.现代软件开发中的应用6.结论        在软件工程的世界里,代码的执行方式多种多样,其中最常见的两种方式是通过解释器和编译器。这两种工具在软件开发中扮演着至关重要......
  • 08 Windows批处理之执行编译后的程序
    本文是关于一个bat文件执行或调用另一种语言编写和编译的程序。实际上,这样做的语法非常简单。本文最有趣的方面是,有时正在执行的程序在bat文件中没有定义路径。bat文件如何找到可执行文件?本文的主要重点将放在查找此类程序的两个非常重要的机制上,即当前目录和路径变量。本主题远......
  • python编译安装亲测
    yumgroupinstall"DevelopmentTools"yuminstallzlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-devellibffi-devellscd/opt/lsmkdirpythoncdpython/  ls  wgethttps://www.python.org/ftp/python/3......