在 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 (比如 VcXSrvXming )来显示 GUI 窗口。

在 WSL 终端里执行下面的命令启动 Lazarus :

SHELLlazarus-ide

也可以使用下面的命令:

SHELLstartlazarus

lazarus-ide

安装 / 配置中文字体

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>

lazarus-ide

采用共享 Windows 字体时,仍有部分中文显示异常。不过在安装中文字体后,一切显示正常。

IDE 启用 Anchor Docking 布局

Lazarus 默认安装使用经典的独立小窗口模式。出于使用习惯,可以参考官方文档《Anchor Docking》将布局合并为单个窗口。在 Lazarus 主菜单中选择「软件包」-「安装/卸载软件包」,在对话框的右侧「可用于安装」列表中选择「 AnchorDockingDsgn 1.0 」进行安装,点击「保存并重新构建IDE」按钮。

install-uninstall-packages

之后 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