在 Rocky Linux 8 上编译安装最新版 iBus-Rime 输入法

在 Rocky Linux 8 (或 CentOS 8)中,系统自带的 librimelibrime-lua 等依赖包版本通常较旧(1.3.0 左右),无法很好地支持 Rime 的一些现代化新特性(比如新版 Lua 插件脚本等)。为了获得最佳的输入体验,我们通常需要安装最新版的 Rime。

你可以用以下命令检查当前系统的 librime 版本:

1
find /usr/lib /usr/lib64 /usr/local/lib /opt -name "librime.so*"

为了系统稳定性与安全,我们不建议直接覆盖系统的默认库。本教程将采用“沙盒化”思路,将新版 Rime 统一编译安装到 /usr/local 目录下,与系统自带环境完全隔离。

开始之前

其它可选方案:

如果你的设备架构是 x86_64,可以考虑以下更简便的方案(不需要手动编译):

  • ibus-rime.AppImage:由社区维护的打包方案,开箱即用,但目前不支持 ARM 架构
  • Fcitx5 + Flatpak:基于 Flatpak 安装 Fcitx5,可以绕开系统旧版 librime 问题。

本文提供手动编译的方法,适用于以下场景:仍需使用 ibus-rime(而非 Fcitx5)、使用 ARM 设备、或希望完全掌控编译过程的用户。

关于编译的安装目录:

P.S. 经研究,实际安装到 /usr 应该也没什么问题,这里安装到 /usr/local 是为了保险。

如果想直接安装到对应路径,则:

  1. 使用 dnf remove 旧版,防止加载到旧版的库。
  2. 下文中,所有涉及 PREFIX 的环境变量和命令,做适当修改。

准备工作:编译前置依赖

在编译核心引擎之前,我们需要安装一些依赖:

1
dnf install marisa-devel yaml-cpp yaml-cpp-devel gtest gtest-devel libnotify zlib zlib-devel gflags gflags-devel leveldb leveldb-devel libnotify-devel ibus-devel

也许还有遗漏,在后续编译过程中,如果有报错,可以再安装对应版本的。

注意:不要安装 glog glog-devel 以及 boost,仓库中的版本过旧,我们稍后会手动编译。

编译链设定

cmake 版本

首先要关注 cmake 的版本要求,虽然 librime 的 CMakeLists.txt 标注的最低版本是 3.12,但根据 librime issue #856,实际上建议使用 cmake >= 3.25 以避免奇怪的编译错误。

检查当前版本:

1
cmake --version

如果版本过低(Rocky 8 默认是 3.20 左右,可能不够),可以从 CMake 官网下载新版二进制:

1
2
3
4
5
6
7
8
9
cd /opt
# 请到 https://cmake.org/download/ 获取最新版本链接
# x86_64 示例:
wget https://github.com/Kitware/CMake/releases/download/v3.30.0/cmake-3.30.0-linux-x86_64.sh
bash cmake-3.30.0-linux-x86_64.sh --prefix=/opt/cmake --skip-license
ln -sf /opt/cmake/bin/cmake /usr/local/bin/cmake

# 验证
cmake --version

切换 GCC 工具链

Rocky Linux 8 的默认 GCC 版本较旧,编译现代 C++ 代码可能报错。建议切换到 GCC 12:

1
2
3
4
5
6
7
8
# 如果未安装,先安装 gcc-toolset-12
dnf install gcc-toolset-12

# 激活新版 GCC(此命令会开启一个新的 shell 子进程)
scl enable gcc-toolset-12 $SHELL

# 验证
gcc --version # 应显示 12.x.x

重要:后续所有编译操作都需要在此 scl enable 开启的 shell 子进程中进行,否则编译器版本会回退到旧版。

编译安装 glog

Rime 依赖 glog 进行日志输出。我们直接从 GitHub 拉取最新版并用 CMake 编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mkdir -p /root/rime-build
cd /root/rime-build

# 切换到新版 gcc,如果没有,先安装
scl enable gcc-toolset-12 $SHELL

# 浅克隆以加快下载速度
git clone --depth=1 [https://github.com/google/glog.git](https://github.com/google/glog.git)
cd glog

# 配置 CMake,指定安装到 /usr/local,并开启动态库构建
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_SHARED_LIBS=ON

# 编译 (-j 参数根据你的 CPU 核心数调整)
cmake --build build -j 32

Tips:在真正安装到系统前,可以先安装到一个临时目录测试一下生成的文件是否结构正确:

1
2
cmake --install build --prefix /tmp/cmake-test
tree /tmp/cmake-test

确认一切正常后,再正式安装并刷新系统动态库缓存:

1
2
sudo cmake --install build
sudo ldconfig

编译安装 Boost (视情况而定)

Rocky 8 自带的 Boost 版本可能较老。

如果你在后续编译中遇到 Boost 相关报错,可能需要手动编译 Boost。

注意:编译 Boost 时,请务必确保勾选/编译了 regex 模块,这是 Rime 强依赖的组件。

第二步编译命令参考:

1
./b2 --with-regex --with-filesystem --with-system install --prefix=/usr/local

正式开始:编译核心组件

源码获取

ibus-rime 的源代码托管在 GitHub 上,同时通过 Git Submodule 关联了 librimeplum 两个子仓库:

1
2
3
cd /root/rime-build
git clone https://github.com/rime/ibus-rime.git
cd ibus-rime

ibus-rime 的编译依赖两个外部子模块,其 .gitmodules 配置如下:

1
2
3
4
5
6
[submodule "librime"]
path = librime
url = https://github.com/rime/librime.git
[submodule "plum"]
path = plum
url = https://github.com/rime/plum.git

执行以下命令一次性拉取所有子仓库:

1
git submodule update --init

如果网络顺畅,这一步通常很顺利。

ibus-rime 关联的 librime 子模块,默认指向的提交可能不是最新的 master。建议手动切换:

1
2
cd /root/rime-build/ibus-rime/librime # 注意此处切换了工作目录
git checkout master

librime 本身不带 Lua 支持,需要通过官方插件机制加载。librime-lua 让 Rime 可以运行 Lua 脚本,是薄荷拼音、雾凇拼音等现代方案的必要依赖。

在 librime 源码目录内,使用自带的插件安装脚本:

1
2
# 在 librime/ 目录内执行
bash install-plugins.sh hchunhui/librime-lua

该脚本会自动从 GitHub 克隆 librime-luaplugins/ 目录下,后面,还要进一步下载 lua 相关文件:

1
2
3
cd /root/rime-build/ibus-rime/librime/plugins/lua
bash action-install.sh # 将自动 clone 一个 repo
cd /root/rime-build/ibus-rime/librime

librime 及 lua 插件

为了让所有文件都在 /usr/local,我们需要在编译前导出几组关键的环境变量,引导编译器去正确的地方找我们刚刚装好的 glog 等库:

1
2
3
4
5
export PREFIX=/usr/local
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
export C_INCLUDE_PATH=/usr/local/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/usr/local/include:$CPLUS_INCLUDE_PATH
export LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:$LIBRARY_PATH

开始编译 librime

第一步是将 librime-lua 插件"合并"进 librime 主体,然后一并编译。

1
2
3
make clean
# 编译并合并插件,这里实际起作用的是小写 prefix,是依据 makefile
make PREFIX=/usr/local prefix=/usr/local merged-plugins -j 32

同样,正式安装前建议走一遍沙盒测试(Dry Run 或 DESTDIR),避免弄脏系统:

1
2
3
4
5
6
# 方式一:Dry Run(只打印即将执行的命令)
make -n prefix=/usr/local install

# 方式二:沙盒目录安装测试
make DESTDIR=/tmp/rime-test prefix=/usr/local install
tree /tmp/rime-test

确认目录结构无误后,执行真正安装:

1
2
sudo make PREFIX=/usr/local prefix=/usr/local install
sudo ldconfig

词库准备:安装 Plum (东风破)

注意:切换工作目录到 ibus-rime/plum/ 内。

Rime 引擎本体不自带词库。plum(东风破)是 Rime 官方的"包管理器",负责从网络拉取词库、配置方案,并将文件部署到 Rime 配置目录。它的工作原理是:读取方案的"处方文件"(.recipe.yaml),按配方克隆仓库并拷贝对应文件到本地配置目录。

ibus-rime 的编译过程对 plum 也有依赖(用于初始化数据),因此这一步不能跳过。

1
2
3
4
5
6
7
cd /root/rime-build/ibus-rime/plum

# 抓取并准备词库数据(默认拉取 preset 预设包)
make

# 强制指定 PREFIX 安装到 /usr/local
sudo make PREFIX=/usr/local install

编译完成后,目录内会生成 rime-install 二进制文件,后续我们可以用它来安装输入方案。

编译前端:ibus-rime

注意:切换工作目录到上一层的 ibus-rime/ 内。

最后一步是编译连接 IBus 框架和 Rime 引擎的"桥梁"——ibus-rime 本体:

1
2
3
4
5
6
7
cd /root/rime-build/ibus-rime

# 清理旧的构建文件
make clean

# 传入大写的 PREFIX 进行编译
make PREFIX=/usr/local

编译顺利完成后(终端最后会打印出一个 :) 笑脸,这是官方 Makefile 里藏的小彩蛋)。

随后执行安装:

1
sudo make PREFIX=/usr/local install

系统集成——让 IBus 识别新版 Rime

现在,所有文件(引擎程序、图标、以及最关键的 rime.xml 注册文件)都已装到 /usr/local

但 Rocky Linux(GNOME 桌面)的 IBus 守护进程启动时,默认只扫描 /usr/share/ibus/component/ 这个绝对路径,不会扫描 /usr/local 下的内容。如果直接重启,IBus 列表里不会出现新安装的 Rime,或者仍然加载旧版。

单用户测试

【这步可能不起作用,可以省略】

为了安全,首先,我们执行单用户测试,切换到普通用户:

1
2
3
4
5
6
7
8
9
10
11
12
# 创建 IBus 的用户级组件目录
mkdir -p ~/.local/share/ibus/component/

# 建立软链接,这样只有这个用户能唤醒 /usr/local 下的新引擎
ln -sf /usr/local/share/ibus/component/rime.xml ~/.local/share/ibus/component/rime.xml

# 刷新缓存
ibus write-cache
rm -rf ~/.cache/ibus/bus/*

# 重启 IBus
ibus restart

全局启用

如果测试完成,要在整个系统启用,我们需要做一个“软链接映射”:

1
2
3
4
5
# 1. 备份系统自带的旧版 XML 注册文件(给自己留一条退路)
sudo mv /usr/share/ibus/component/rime.xml /usr/share/ibus/component/rime.xml.bak

# 2. 将 /usr/local 的注册文件“映射”到系统 IBus 目录下
sudo ln -sf /usr/local/share/ibus/component/rime.xml /usr/share/ibus/component/rime.xml

重启 IBus 服务,让它重新扫描(如果无效,可能需要注销当前用户并重新登录):

1
ibus restart

现在,前往系统设置 → 区域和语言 → 输入源,应该能看到崭新的"中文 (Rime)"选项了。

错误排查指南:如何确保程序加载了新版动态库?

Linux 动态链接器有时候比较“固执”,可能会默认加载系统的旧版 librime.so。我们可以用以下命令排查:

1
2
3
4
5
6
7
8
# 查看旧版库是否有人在使用
lsof /usr/lib64/librime.so*

# 查看新版库是否正确被加载
lsof /usr/local/lib64/librime.so*

# 检查当前运行的进程
ps -ef | grep ibus-engine-rime

如果发现 ibus-engine-rime 依然在加载旧版的库,有以下几种优雅的解决方式:

方案 A:使用 Wrapper 包装脚本启动(最安全,推荐)

保留系统原样,通过脚本在进程内修改环境变量:

  1. 将原执行文件重命名为 ibus-engine-rime.real

    1
    2
    sudo mv /usr/local/lib/ibus-rime/ibus-engine-rime \
    /usr/local/lib/ibus-rime/ibus-engine-rime.real
  2. 新建同名的脚本文件,赋予可执行权限(chmod +x),写入以下内容:

    1
    2
    3
    4
    5
    6
    7
    sudo tee /usr/local/lib/ibus-rime/ibus-engine-rime > /dev/null << 'EOF'
    #!/bin/bash
    # 如果手动编译了 boost,也需要加上 /usr/local/lib
    export LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:$LD_LIBRARY_PATH
    exec "$(dirname "$0")/ibus-engine-rime.real" "$@"
    EOF
    sudo chmod +x /usr/local/lib/ibus-rime/ibus-engine-rime
  3. 开个新的 SSH 会话,验证依赖是否全部可以找到:

    1
    2
    # 设置好环境变量后,用 ldd 检查有无 "not found" 的依赖
    LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib ldd /usr/local/lib/ibus-rime/ibus-engine-rime.real

方案 B:使用 patchelf 事后修补 ELF 文件

直接修改二进制文件头,强行指定 RPATH:

1
2
3
4
5
6
7
8
# 安装 patchelf
dnf install patchelf

# 修改 RPATH
patchelf --set-rpath /usr/local/lib64 /usr/local/lib/ibus-rime/ibus-engine-rime

# 验证
ldd /usr/local/lib/ibus-rime/ibus-engine-rime

方案 C:在编译期直接指定 RPATH

如果你喜欢从根本上解决问题,可以在编译 ibus-rime 源码时就写死路径:

1
2
3
4
# 在 make 时传入 LDFLAGS
make PREFIX=/usr/local \
LDFLAGS="-Wl,-rpath=/usr/local/lib64 -Wl,-rpath=/usr/local/lib" \
-j$(nproc)

附录:配置分享与推荐

输入方案推荐

自带的方案当然是不够用的,这里向各位推荐 Oh My Rime (薄荷拼音),其内置丰富的词库,以及 lua 支持,体验下来很不错。

在 plum 目录下:

1
2
# 全量安装薄荷拼音配置(同名文件会被替换,custom 文件不受影响)
./rime-install Mintimate/oh-my-rime:plum/full

如果使用的是 Fcitx5,需要通过环境变量指定配置目录:

1
rime_dir="$HOME/.local/share/fcitx5/rime" bash rime-install Mintimate/oh-my-rime:plum/full

个人配置小抄

配合薄荷拼音,可以在个人配置目录 ${HOME}/.config/ibus/rime 下创建或修改 rime_mint.custom.yaml,实现一些个性化调整:

1
2
3
4
5
6
7
8
9
10
patch:
# 候选项排列方向:stacked (垂直) | linear (水平) | tabled (网格)
# 这里设置为 linear 水平显示,更符合传统拼音输入法习惯
style/candidate_list_layout: linear

# 关闭词典的附注/注释说明,让候选项看起来更清爽
translator/always_show_comments: false

# 如果是用在服务器/开发机上,可以设置默认开启英文模式 (1为英文,0为中文)
switches/@0/reset: 1

修改配置后,需要在 IBus 的 Rime 菜单中点击"部署"(Deploy)或执行以下命令使配置生效:

1
2
3
# 触发 Rime 重新部署
touch ~/.config/ibus/rime/installation.yaml
ibus restart

参考资料

本文主要参考了此博客:Linux上手动编译安装librime、librime-lua以及ibus-rime,具有很大的帮助,在此表示感谢。

上面的作者提供的内容主要面向 Debian 系,而在 RHEL 系的系统编译有诸多细节,故笔者撰写了此文。

其它值得参考的链接:

  • librime-lua GitHub
  • rime/home Wiki - RimeWithIBus
  • Oh My Rime(薄荷拼音)
  • rime-ice issue #840 - Linux 安装建议