摘要:本文介绍了Win7 64位环境下编译OpenCC(Open Chinese Convert)1.0.4源码的整个过程。 除了VS2017之外,VS2013及以上版本应该也基本适用,其他版本的Windows操作系统也应该适用。 本文不仅完成了基本的编译过程c 怎么编译源码,还强调并解决了开放网络上Windows环境下编译OpenCC 1.0.4过程中尚未解决的两个问题(Github和搜索引擎上都没有答案) 。
1.VS的版本关系
VC10,对应VS2010
VC11,对应VS2012
VC12,对应VS2013(OpenCC需要VS2013以上版本)
VC14,对应VS2015
VC15,对应VS2017(CMAKE直接生成的该版本的解决方案,编译时有未解决的BUG,稍后详述)
2. 为什么要从源码编译
1、OpenCC默认不发布Windows平台下的二进制文件;
2、需要进行源代码级别的修改;
3.OpenCC简介
OpenCC(Open Chinese Convert、Open English Conversion)是一个用于简体和繁体之间英文转换的开源项目。 支持词汇级转换、异体字转换、地区惯用词转换(中国大陆、台湾、香港)。 其官方网站位于Github:。
OpenCC严格区分“一简单到多”和“一简单到多不同”,完全兼容异体字,支持中国大陆、台湾、香港的异体字和地域惯用词的转换,词库和函数库完全分离,支持C和C++、Python、PHP、Java、Ruby、Node.js和Android,兼容Windows、Linux和Mac平台。
在Github的Wiki中,有OpenCC的详细介绍以及与cconv的比较。 它还支持现代汉语中常用的常见的一对多词义和地名。 从介绍来看,这应该是一个很好的解决方案。
4、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后,使用以下命令生成VisualStudio解决方案文件并编译(32位):
cmake -H. -Bbuild -G“Visual Studio 15”-DCMAKE_INSTALL_PREFIX =“路径/到/安装”
cmake –build 构建 –config Release –target install
请注意,您需要根据本地安装的具体Visual Studio版本选择合理的“Visual Studio *”,其中:
VC10,对应VS2010
VC11,对应VS2012
VC12,对应VS2013
VC14,对应VS2015
VC15,对应VS2017(请注意,直接使用“Visual Studio 15”生成的解决方案无法编译,怀疑是VS的BUG,具体参见问题②)。 如果选择不合适的版本,会报找不到对应版本的工具链,可以通过Visual Studio Installer进行安装(后面会详细介绍)。
请注意,在个别机器上,如果直接从CMD运行上述命令,可能会报如下错误:
使用CMD直接运行CMAKE时报错
无法运行 MSBuild 命令:
MSBuild.exe
获取 VCTargetsPath 的值:
配置不完整,出现错误!
此时,从 Visual Studio 开发人员控制台(开发人员命令提示符):
使用 VS 开发人员命令提示符编译 OpenCC
在以下位置运行上述命令:
在VS开发者命令提示符下编译OpenCC1.0.4
编译完成后,生成的VS工程文件等会输出到builid目录下:
VS开发者命令提示符下编译OpenCC1.0.4结果
然后打开buildid目录下的.sln解决方案文件:
CMAKE生成OpenCC1.0.4 VisualStudio解决方案文件
在VS中打开解决方案后,默认的启动项目是ALL_BUILD,只需点击菜单中的“生成-重新生成解决方案”即可重新生成解决方案。 请注意,OpenCC1.0.4版本CMAKE生成的VS2017(Visual Studio 15)解决方案文件直接编译时会出现两类错误:
①PhraseExtract.cpp文件编码问题
opencc_phrase_extract 项目和 libopencc 项目编译失败。 这两个项目中的PhraseExtract.cpp文件(路径分别位于src/PhraseExtract.cpp和src/tools/PhraseExtract.cpp)会因为编码问题而报错:
警告 C4819 文件包含当前代码页 (936) 无法表示的字符。请以 Unicode 格式保存此文件以避免数据丢失
错误 C3688 无效的文字后缀“断”; 无文字文字运算符或文字运算符模板“operator”“”““檚”
错误 C3688 无效的文字后缀“t”; 找不到文字运算符或文字运算符模板“operator”“”“dze”
错误 C3688 无效的文字后缀“&#”; 未找到文字运算符或文字运算符模板“运算符“”“””
常量中的错误 C2001 换行符
如下所示:
默认生成的VS2017解决方案早上报错
此时,您可以将PhraseExtract.cpp文件的编码从默认的“简体英语(GB2312-代码页936)”和“Uncode(UTF-8无符号)-代码页65001”更改为“Unicode-代码页1200” 》解决方案(如果找不到“高级保存选项”,请参考《解决Visual Studio 2017(VS2017)中找不到/没有“高级保存选项”的问题》):
修改OpenCC 1.0.4中PhraseExtract.cpp文件的编码,解决编译错误
网上有一篇文章《使用OPENCC库进行简繁体转换(C++代码)》在搜索引擎中排名很高:
这里1.0.4版本的项目:opencc_phrase_extract编译比较困难,GIT上也有相应的issue,只要删除这个项目就可以了c 怎么编译源码,不会影响使用,不用担心。
如下所示:
错误的处理PhraseExtract.cpp文件编码问题导致编译失败的方法
这其实是一种错误的鸵鸟做法。 其实这个问题可以通过改变本文介绍的文件编码方式来解决。 在本文最后我们还可以看到tools文件夹中生成了opencc_phrase_extract.exe.exe。
②setjmp莫名其妙的奇怪BUG
除了编码问题之外,C语言中用于异常处理的longjmp和setjmp还有几个特有的bug:
错误 C3829 标准属性“noreturn”仅适用于函数 libopencc d:Program Files (x86)Microsoft Visual Studio2017ProfessionalVCToolsMSVC14.12.25827includesetjmp.h 165
错误 C2206“longjmp”: typedef 不能在函数定义 libopencc d:Program Files (x86)Microsoft Visual Studio2017ProfessionalVCToolsMSVC14.12.25827includesetjmp.h 165 中使用
错误 C2039“longjmp”:不是“全局命名空间”libopencc d:Program Files (x86)Microsoft Visual Studio2017ProfessionalVCToolsMSVC14.12.25827includecsetjmp 10 的成员
错误 C2873 'longjmp':符号不能在 using 声明 libopencc d:Program Files (x86)Microsoft Visual Studio2017ProfessionalVCToolsMSVC14.12.25827includecsetjmp 10 中使用
如下所示:
用VS2017编译OpenCC1.0.4源码时出现奇怪的错误
上述错误报告的位置位于以下形式:
d:Program Files (x86)Microsoft Visual Studio2017ProfessionalVCToolsMSVC14.12.25827includesetjmp.h(165)
头文件中,头文件是VS自带的头文件。 上述四个错误在所有搜索引擎都没有答案。 我在 OpenCC 所在的 GitHub 上的 Issue#287 提到了这个问题,看看以后有没有人能解决。
直观上可能是因为VS2017的问题,于是尝试使用“Visual Studio 14”降级到VS2015编译,结果成功:
cmake -H. -Bbuild -G“Visual Studio 14”-DCMAKE_INSTALL_PREFIX =“路径/到/安装”
cmake –build 构建 –config Release –target install
请注意,必须安装V140工具集才能使用“Visual Studio 14”,否则会报错,可以通过Visual Studio Installer完成:
使用 Visual Studio 安装程序安装 v140 工具集
在“修改-单个组件”中选择“VC++ 2015.3 v140 Toolset for Desktop (x86,x64)”:
使用 Visual Studio 安装程序安装 v140 工具集
安装完成后,再次尝试编译,成功:
使用“Visual Studio 14”降级到VS2015成功编译OpenCC1.0.4
在VS2017中打开opencc.sln解决方案,可以观察到项目属性的“目标平台版本”为8.1,而VS2017的默认值为10.0.x,这可能是编译失败的原因之一VC15:
VS2015解决方案文件中项目属性的“目标平台版本”
编译后生成的二进制文件位于./build/src/Release目录下,一共有三个:
OpenCC1.0.4编译的二进制文件
其中opencc.dll是动态链接库,opencc.lib是静态链接库。
另外./build/src/tools/Release目录下还有编译生成的相关工具:
OpenCC1.0.4编译的二进制文件(工具)
我们可以看到,在tools文件夹下生成了opencc_phrase_extract.exe文件,没有使用鸵鸟策略。
直接运行OpenCC,可以正常输出(因为最新代码是直接从GitHub master拉取的,版本号已经到了1.0.5):
运行编译好的OpenCC
5.编译64位(x64)OpenCC
如果要编译64位版本,可以使用以下命令生成VisualStudio解决方案:
cmake -H. -Bbuild -G“Visual Studio 14 Win64” -DCMAKE_INSTALL_PREFIX="path/to/install"
cmake –build 构建 –config Release –target install