一、VS的版本关系
VC10,对应VS2010
VC11,对应VS2012
VC12,对应VS2013(OpenCC要求VS2013以上版本)
VC14,对应VS2015
VC15,对应VS2017(CMAKE直接生成的此版本解决方案在编译时存在未解决的BUG,后详)
二、为什么要从源码编译
1、OpenCC默认没有发布Windows平台下的二进制文件;
2、需要进行源码级别的修改;
三、OpenCC介绍
OpenCC (Open Chinese Convert,开放中文转换) 是一个用于中文简繁转换的开源项目,支持词汇级别的转换、异体字转换和地区习惯用词转换(中国大陆、台湾、香港),其官网位于Github中:https://github.com/BYVoid/OpenCC。
OpenCC严格区分「一简对多繁」和「一简对多异」,完全兼容异体字,支持中国大陆、台湾、香港异体字和地区习惯用词转换,词库和函数库完全分离,支持C、C++、Python、PHP、Java、Ruby、Node.js和Android,兼容Windows、Linux、Mac平台。
在Github的Wiki中,有对OpenCC的详细介绍和与cconv的对比,对于现代汉语常用简繁一对多字义、地名等也进行了支持,从介绍上看应该是一个较优秀的解决方案。
四、在Windows平台下使用CMAKE和Visual Studio编译OpenCC
OpenCC是使用C++编写的,编译是需要用到CMAKE和Windows Visual Studio(2013或更高版本),有关CMAKE的安装可以参见本站的文章《Win7 64位环境下OpenCV 3.3.0源码编译及VS2010(VS10)下开发》中的相关内容,在此不再赘述,本文使用的CMAKE 3.9.2和Visual Studio版本分别是:

编译OpenCC 1.0.4使用的CAMKE版本

编译OpenCC 1.0.4使用的VisualStudio版本
cmake -H. -Bbuild -G“Visual Studio 15” -DCMAKE_INSTALL_PREFIX=”path/to/install”
cmake –build build –config Release –target install
VC10,对应VS2010
VC11,对应VS2012
VC12,对应VS2013
VC14,对应VS2015
VC15,对应VS2017(请注意,直接使用”Visual Studio 15″生成的解决方案编译不了,怀疑是VS的BUG,详见问题②)。如果选择了不恰当的版本会报找不到相应版本的工具链,可以通过Visual Studio Installer进行安装(后详)。

直接使用CMD运行CMAKE时的报错
Failed to run MSBuild command:
MSBuild.exe
to get the value of VCTargetsPath:
Configuring incomplete, errors occurred!

使用VS开发人员命令提示符编译OpenCC

在VS开发人员命令提示符中编译OpenCC1.0.4

在VS开发人员命令提示符中编译OpenCC1.0.4结果

CMAKE生成OpenCC1.0.4的VisualStudio解决方案文件
①PhraseExtract.cpp文件编码问题
opencc_phrase_extract项目和libopencc项目无法编译,这两个项目中的PhraseExtract.cpp文件(路径分别位于src/PhraseExtract.cpp和src/tools/PhraseExtract.cpp)由于编码问题会报错:
警告 C4819 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
错误 C3688 文本后缀“銆”无效;未找到文文本运算符或文本运算符模板“operator “”””銆”
错误 C3688 文本后缀“锛”无效;未找到文文本运算符或文本运算符模板“operator “”””锛”
错误 C3688 文本后缀“鈥”无效;未找到文文本运算符或文本运算符模板“operator “”””鈥”
错误 C2001 常量中有换行符

默认生成的VS2017解决方案编译时报错

修改OpenCC 1.0.4中PhraseExtract.cpp文件的编码以解决编译错误
此处1.0.4版本中项目:opencc_phrase_extract 是无法编译的,在GIT上也有对应的issue,删除该项目即可,不影响使用,所以不用管他。

处理PhraseExtract.cpp文件编码问题导致编译失败的错误方式
②setjmp莫名其妙的诡异BUG
除了编码问题外,还有几个关于longjmp和setjmp的诡异BUG,这两个函数用于在C语言中进行异常处理:
错误 C3829 标准属性 “noreturn” 只可适用于函数 libopencc d:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.12.25827\include\setjmp.h 165
错误 C2206 “longjmp”: typedef 不能用于函数定义 libopencc d:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.12.25827\include\setjmp.h 165
错误 C2039 “longjmp”: 不是“`global namespace’”的成员 libopencc d:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.12.25827\include\csetjmp 10
错误 C2873 “longjmp”: 符号不能用在 using 声明中 libopencc d:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.12.25827\include\csetjmp 10

使用VS2017编译OpenCC1.0.4源码时的诡异错误
d:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.12.25827\include\setjmp.h(165)
直觉上,感觉可能是由于VS2017的问题,因此尝试使用了”Visual Studio 14″降级到VS2015编译,结果成功:
cmake -H. -Bbuild -G”Visual Studio 14” -DCMAKE_INSTALL_PREFIX=”path/to/install”
cmake –build build –config Release –target install
请注意,要使用”Visual Studio 14″必须安装V140工具集,否则会报错,这可以通过Visual Studio Installer进行:

使用Visual Studio Installer安装v140工具集
在“修改-单个组件”中选择“用于桌面的VC++ 2015.3 v140工具集(x86,x64)”:

使用Visual Studio Installer安装v140工具集
安装完成后,再次尝试编译,成功:

使用”Visual Studio 14″降级到VS2015编译OpenCC1.0.4成功
在VS2017中打开opencc.sln的解决方案,可以观察到项目属性的“目标平台版本”为8.1,而VS2017默认的为10.0.x,这可能是此前使用VC15编译失败的原因之一:

VS2015解决方案文件中项目属性的的“目标平台版本”

OpenCC1.0.4编译后输出的二进制文件

OpenCC1.0.4编译后输出的二进制文件(工具)

运行编译出的OpenCC
五、编译64位(x64)的OpenCC
如果要编译64位版本,可以使用如下的命令生成VisualStudio解决方案:
cmake -H. -Bbuild -G“Visual Studio 14 Win64″ -DCMAKE_INSTALL_PREFIX=”path/to/install”
cmake –build build –config Release –target install
转载时请保留出处,违法转载追究到底:进城务工人员小梅 » 使用Visual Studio 2017(VS2017)编译OpenCC 1.0.4 (Open Chinese Convert)源代码