用Visual Studio 2019编译Rime输入法的Windows版本Weasel


主题图片

编译动机

最近把电脑和手机上的输入法都换成了RIME,毕竟不太想让商业输入法将自己的输入内容放到云端进行统计分析。

使用了RIME一段时间之后,整体感觉很不错,特别是在PC端,可自定义的东西比较多,跟之前所用的商业输入法进行输入的效率差不多(之后有时间详细说说这个输入法的特点和配置)。但是,无论是在PC端还是在移动端,有一个小遗憾是它不支持输入的联想功能,虽然也有一些尝试性的解决方案,如作者写了一个rime-predict插件,也有通过采用lua脚本来实现的,但目前还没有尝试成功。所以想着之后有时间可以折腾一下,对输入法进行一定的功能扩展,甚至与ChatGPT结合。要对RIME输入法进行功能扩展,需要对其源代码进行编译。

出现的问题

在Windows下,RIME输入法的UI实现叫做小狼毫输入法,英文为Weasel。从Weasel项目网站上下载了源代码后,以为直接按照官方文档进行编译就可以了,但其实有一些坑,比如会出现错误:项目编译过程中出现“无法解析的外部符号”,我也遇到了同样的问题,原作者也没有给出相应的解决方案。可能表面原因是,我机器上安装的是Visual Studio 2019,而官方文档中采用的是Visual Studio 2017进行编译的。

对于“无法解析外部符号”这个问题,通过分析源代码中提供的build.bat,大概了解了一下主要原因。首先,Rime-Weasel项目中包含有两个部分,第一是RIME输入法引擎librime项目,第二是与Windows平台部署和界面相关的项目,这里统称为weasel。如果采用默认的x64构架进行编译,build.bat all在编译的时候,先把librime项目编译成了x64的,但weasel相关的几个项目编译成了Win32的,这样编译weasel时想要链接librime库的时候,由于构架不一样,就会出这个错。我也尝试了把librime设置成编译为Win32的,再进行编译,也还是会出现这个错误。

解决方案

既然无法通过build.bat all命令一次性编译出Weasel,就只能先单独编译好32位的libirime,然后再手动把生成的库放到weasle项目中,再单独编译weasel。以下是我的编译过程,至少在我的机器上可能正常安装运行。

1. 编译的准备

  1. 安装Boost,下载boost_1_82_0.zip,解压到自己的开发目录,比如我的目录是d:/DevLibrary/boost/v1820。
  2. 安装NSIS,我安装的是最新版的,编译没问题
  3. 确保安装了Cmake、python2.7(这两个包我的系统中已安装)
  4. 确保你的VS2019安装了MFC,如果没有,请勾选并安装,不然后面会出现“cannot open include file afxres.h”的错误,

2. 编译librime

可按照官方文档的说明,进行编译。也可参考项目文件: https://github.com/rime/librime/.github/workflows/windows-build.yml

  1. 下载代码: git clone --recursive https://github.com/rime/librime.git,因为有的库下载有问题,所以有可能需要设置代理。
  2. librime文件夹,依据env.bat.template为模板创建env.bat,并修改其中的参数和路径,见下面的文件内容。注意设置框架为Win32,我尝试过都用x64框架来编译,但编译Weasle还是会出错。
  3. 从开始菜单打开Developer Command Prompt for VS 2019命令行窗口
  4. 在命令窗口,用cd命令进入librime目录,用命令env.bat导入环境变量
  5. 在命令窗口,运行build.bat boost编译Boost
  6. 在命令窗口,运行build.bat deps编译依赖
  7. 在命令窗口,运行build.bat librime编译rime库
  8. 最后编译得到的文件在目录:librime/dist

下面是我的env.bat文件内容,相关目录请根据自己的系统路径进行设置

rem Customize your build environment and save the modified copy to env.bat
set RIME_ROOT=%CD%

rem REQUIRED: path to Boost source directory
if not defined BOOST_ROOT set BOOST_ROOT=D:\DevLibrary\boost\v1820

rem OPTIONAL: architecture, Visual Studio version and platform toolset
set ARCH=Win32
set BJAM_TOOLSET=msvc-14.2
set CMAKE_GENERATOR="Visual Studio 16 2019"
set PLATFORM_TOOLSET=v142

rem OPTIONAL: path to additional build tools
set DEVTOOLS_PATH=%ProgramFiles%\Git\cmd;%ProgramFiles%\Git\usr\bin;%ProgramFiles%\CMake\bin;D:\GreenPrograms\python\python2x\;

如果要想要同时编译一些附加插件:

  1. 在命令窗口,添加插件定义set RIME_PLUGINS=rime/librime-charcode hchunhui/librime-lua lotem/librime-octagram lotem/librime-predict
  2. 如果要编译librime-lua,需要下载lua的静态库:将下载好的32位的lua53.lib放到librime/lib目录下。
  3. 回到Developer Command Prompt for VS 2019命令行窗口
  4. 确保按上面的步骤已编译boost和deps
  5. 在命令窗口,运行.\action-install-plugins-windows.bat,安装插件。如果之前安装过,要把之前的插件文件夹中的相关文件夹删除,否则会出错。
  6. 在命令窗口,运行build.bat librime重新编译rime库。

3. 编译weasel

  1. 下载代码: git clone --recursive https://github.com/rime/weasel.git,如果有的库下载有问题,考虑使用代理进行下载
  2. weasel文件夹,依据env.vs2019.bat为模板创建env.bat,并修改其中的参数和路径,相关设置可参考上面的env.bat文件,同样要注意要设置为Win32构架。
  3. 将之前编译得到的librime/dist中的rime.lib库和头文件拷贝到Weasel项目的weasel/libweasel/include目录下,同时也要将librime/dist/rime.dll拷贝到weasle/output目录下,这个output目录在编译wealse时会自动生成。
  4. 回到Developer Command Prompt for VS 2019命令行窗口
  5. 在命令窗口,用cd命令进入weasel目录,用命令env.bat导入环境变量
  6. 在命令窗口,运行build.bat boost data opencc编译相关依赖
  7. 在命令窗口,运行build.bat weasel编译依weasle
  8. 编译结果会产生到文件夹:weasel/output
  9. 运行build.bat installer打包
  10. 安装文件会产生到文件夹:weasel/output/archives

以上就是我编译用Visual Studio 2019编译Rime-weasle的过程记录,如果有更好的解决方案,欢迎留言告之。