在 WSL 中运行 Lazarus IDE
Free Pascal 支持交叉编译,理论上是可以在 Windows 平台上编译 Linux 可执行文件的,但是官方没有提供相关文档,且不建议这么做。除了使用虚拟机外,在 Windows 平台上还可以使用 WSL 来交叉编译 Lazarus 项目。
安装 IDE 和 Free Pascal 编译器
本人 WSL 安装的是 Ubuntu 系统,但是 apt 源中自带的 Lazarus 2.0 版本太过陈旧,建议直接从官网下载最新版。这里下载 64 位版本,包括以下三个安装文件:
在 WSL 终端里执行下面的命令进行安装:
shellsudo apt install ./fpc-laz_3.2.2-210709_amd64.deb
sudo apt install ./fpc-src_3.2.2-210709_amd64.deb
sudo apt install ./lazarus-project_3.0.0-0_amd64.deb
最新版本的 WSL 通过 Remote Desktop Client 组件( msrdc.exe )可以直接显示 WSL 的 GUI 应用,无需任何配置。对于老版本的 WSL ,需要安装一款 XServer (比如 VcXSrv 或 Xming )来显示 GUI 窗口。
在 WSL 终端里执行下面的命令启动 Lazarus :
shelllazarus-ide
也可以使用下面的命令:
shellstartlazarus

安装 / 配置中文字体
WSL 默认安装的 Ubuntu 没带中文字体,需要安装一款中文字体:
shellsudo apt install fonts-noto-cjk
或者使用 Windows 的中文字体:
shellsudo apt install fontconfig
在配置文件 /etc/fonts/local.conf
中写入:
xml<fontconfig>
<dir>/mnt/c/Windows/Fonts/</dir>
</fontconfig>

采用共享 Windows 字体时,仍有部分中文显示异常。不过在安装中文字体后,一切显示正常。
IDE 启用 Anchor Docking 布局
Lazarus 默认安装使用经典的独立小窗口模式。出于使用习惯,可以参考官方文档《Anchor Docking》将布局合并为单个窗口。在 Lazarus 主菜单中选择「软件包」-「安装/卸载软件包」,在对话框的右侧「可用于安装」列表中选择「 AnchorDockingDsgn 1.0 」进行安装,点击「保存并重新构建IDE」按钮。

之后 Lazarus 会重新编译,并在编译成功后自动重启。
修复若干问题
不出意外,在安装和配置 Lazarus IDE 的过程中,意外就发生了。
问题一
WSLg 渲染的「安装/卸载软件包」对话框无法操作,处于不可用状态。查看日志 /mnt/wslg/weston.log 发现如下内容:
[12:34:56.789] Client: ClientGetAppidReq: WindowId:0x53 does not have appId, or not top level window.
这应该是一个兼容性问题,暂时没有找到 WSLg 下的解决方案。最后使用 MobaXterm 自带的 XServer 临时解决了安装软件包的问题。
问题二
在重新构建 IDE 的时候,编译器报错:
构建 IDE: 退出代码2,错误: 1
Makefile(135,0) Error: linker:*** Compiler /usr/bin/fpc.exe not found. Stop.
很显然,是 Lazarus 的某个 Makefile 文件配置有问题,错误地使用了 Windows 版本的可执行文件扩展名。在一阵翻找后,发现 Lazarus 携带的 Makefile 文件还挺多的,无法定位是哪个 Makefile 文件出的问题。最后只能曲线救国,生成一个 fpc.exe
出来。在 WSL 终端下执行命令:
shellsudo ln -s /usr/bin/fpc /usr/bin/fpc.exe
在主菜单中选取「工具」-「使用配置文件: 一般的IDE 构建 Lazarus 」,重新构建 Lazarus 。
经过论坛老哥的指点,发现第二问题是由于 Lazarus 错误地使用了 Windows 环境中的 make 命令来执行编译导致的。虽然我不理解明明 WSL 下 which make
返回的结果是 /usr/bin/make
,可 Lazarus 却还是会使用 Windows 环境中的 make 命令。在 WSL 中使用下面的命令剔除 Windows 的 PATH 环境变量便可以解决问题:
shellexport PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/snap/bin
或者在配置文件 /etc/wsl.conf 中禁止 WSL 使用 Windows 的路径:
ini[interop]
appendWindowsPath = false
问题三
Lzaraus 成功安装后,能在 Windows 开始菜单里找到菜单项「Lazarus (Ubuntu)」。在 Windows 中直接点击就能打开 Linux 版的 Lazarus 了。不过,当我们启用 Anchor Docking 布局并重新编译 Lazarus IDE 后就会发现,通过 Windows 开始菜单项启动 Lazarus IDE 会闪退。这是因为 IDE 重新编译后,会在目录 ~/.lazarus/bin 下生成新的 lazarus 可执行文件,使用 startlazarus
启动后会创建新进程 ~/.lazarus/bin/lazarus 并退出当前进程,而 WSLg 无法渲染新进程的 GUI。
解决方法是修改 Windows 菜单的快捷方式目标为:
"C:\Program Files\WSL\wslg.exe" -d Ubuntu --cd "~" -- ~/.lazarus/bin/lazarus