用Visual Studio 2019编译Rime输入法的Windows版本Weasel
By xpgo on May 7, 2023
编译动机
最近把电脑和手机上的输入法都换成了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. 编译的准备
- 安装Boost,下载boost_1_82_0.zip,解压到自己的开发目录,比如我的目录是d:/DevLibrary/boost/v1820。
- 安装NSIS,我安装的是最新版的,编译没问题
- 确保安装了Cmake、python2.7(这两个包我的系统中已安装)
- 确保你的VS2019安装了MFC,如果没有,请勾选并安装,不然后面会出现“cannot open include file afxres.h”的错误,
2. 编译librime
可按照官方文档的说明,进行编译。也可参考项目文件: https://github.com/rime/librime/.github/workflows/windows-build.yml
- 下载代码:
git clone --recursive https://github.com/rime/librime.git
,因为有的库下载有问题,所以有可能需要设置代理。 - 到
librime
文件夹,依据env.bat.template
为模板创建env.bat
,并修改其中的参数和路径,见下面的文件内容。注意设置框架为Win32,我尝试过都用x64框架来编译,但编译Weasle还是会出错。 - 从开始菜单打开
Developer Command Prompt for VS 2019
命令行窗口 - 在命令窗口,用cd命令进入
librime
目录,用命令env.bat
导入环境变量 - 在命令窗口,运行
build.bat boost
编译Boost - 在命令窗口,运行
build.bat deps
编译依赖 - 在命令窗口,运行
build.bat librime
编译rime库 - 最后编译得到的文件在目录:
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\;
如果要想要同时编译一些附加插件:
- 在命令窗口,添加插件定义
set RIME_PLUGINS=rime/librime-charcode hchunhui/librime-lua lotem/librime-octagram lotem/librime-predict
- 如果要编译librime-lua,需要下载lua的静态库:将下载好的32位的
lua53.lib
放到librime/lib
目录下。 - 回到
Developer Command Prompt for VS 2019
命令行窗口 - 确保按上面的步骤已编译boost和deps
- 在命令窗口,运行
.\action-install-plugins-windows.bat
,安装插件。如果之前安装过,要把之前的插件文件夹中的相关文件夹删除,否则会出错。 - 在命令窗口,运行
build.bat librime
重新编译rime库。
3. 编译weasel
- 下载代码:
git clone --recursive https://github.com/rime/weasel.git
,如果有的库下载有问题,考虑使用代理进行下载 - 到
weasel
文件夹,依据env.vs2019.bat
为模板创建env.bat
,并修改其中的参数和路径,相关设置可参考上面的env.bat
文件,同样要注意要设置为Win32构架。 - 将之前编译得到的
librime/dist
中的rime.lib
库和头文件拷贝到Weasel项目的weasel/lib
和weasel/include
目录下,同时也要将librime/dist/rime.dll
拷贝到weasle/output
目录下,这个output目录在编译wealse时会自动生成。 - 回到
Developer Command Prompt for VS 2019
命令行窗口 - 在命令窗口,用cd命令进入
weasel
目录,用命令env.bat
导入环境变量 - 在命令窗口,运行
build.bat boost data opencc
编译相关依赖 - 在命令窗口,运行
build.bat weasel
编译依weasle
- 编译结果会产生到文件夹:
weasel/output
- 运行
build.bat installer
打包 - 安装文件会产生到文件夹:
weasel/output/archives
以上就是我编译用Visual Studio 2019编译Rime-weasle的过程记录,如果有更好的解决方案,欢迎留言告之。