前言

对于Lazarus跨平台开发接触有一段时间了,虽然踩了不坑,但仍觉得已踩过的坑不过是九牛一毛。不过还是应该记录一下,以备忘,以后又踩新坑了再补充吧。

环境

项目 Linux Windows
操作系统 Debian 12 Win10
CPU架构 x86_64 x86_64
桌面环境 xfce 4 /
输入法 fcitx 5 系统自带
GUI环境 gtk2/qt5/qt6 win32/gtk2/qt5
目标程序 64位 32位/64位
  • Qt6Pas1.dll未能得到,win + qt6未测试

  • linux 64位系统未能设置好32位运行环境,未测试

  • qt5未能得到64位dll,未测试

windows

  • Application.MessageBox按钮文字英文,无法直接本地化,Windows.MessageBoxAPI可以

  • TPageControl组件自带的关闭按钮在win32下不可用,gtk2qt5正常

  • qt5下,某些组件会有很诡异的现象

  • gtk2下,64位目标程序运行时报错

  • gtk2下,默认界面很丑,需要用皮肤

  • 带GUI的dll机制和行为与delphi不一致

  • 使用ShareMem单元需要自行构建fpcmemdll.dll

linux

  • gtk2IDE无法输入中文;目标程序可正常输入(SynEdit不可以,必须修改相关源码)

  • qt5qt6IDE可输入中文,但部分字无法输入,也无法正常输入多于两个字的词组;目标程序存在相同的问题

  • qt5IDE及目标程序所需要的libqt5pas一定要和编译用的IDE版本匹配

总结

基于有限的测试经验,得出了以下结论:

  • 虽然Lazarus是跨平台的,并且号称一次编写,到处编译,但GUI的跨平台表现是不完全一致的,需要分别处理

  • 整体上,gtk2兼容性和稳定性优于qt

  • 最佳的开发方案:在windows系统上开发,然后交叉编译或在目标环境下进行编译(若使用了SynEdit,必须修改相关源码)

  • 保持跨平台一致性的方案:windows平台采用32位gtk2+皮肤linux平台采用gtk2+皮肤