概述

按照以前的经验,编译Tesseract 3.05就是去GitHub上找一个已经解决了依赖关系(如Leptonica等)的VS2015解决方案,然后在VS中编译生成?是不是最痛苦的地方就是找不到这样的解决方案,或者在自己的Windows中不能正常编译?

Tesseract官方对3.05和之后版本在Windows下的编译提供了新的方法,只需要简单几步就能万无一失编译出自己想要的libtesseract.dll或者tesseract.exe!下面主要介绍如何在Windows下编译生成32位和64位的动态链接库DLL,即libtesseract305.dll。

本文主要参考Tesseract官方wiki,链接见参考。

背景

编译的最大问题就是如何解决依赖,和创建兼容的解决方案了;Tesseract为我们带来了CPPAN和CMAKE这两个工具来解决这两个问题。查看新的Tesseract源码,你会发现两个不太熟悉的文件cppan.ymlCMakeLists.txt,就是靠的这两个文件!

CPPAN

CPPAN之于C++就像Maven之于Java,如果你用过Maven,想必马上就能明白CPPAN的用处了。CPPAN可以理解为C++的包管理器,包含了众多依赖包,只需要向CPPAN指定依赖包,CPPAN就会帮你下载好需要的依赖包和相关配置。怎么指定?那就是通过cppan.yml文件了。

Tesseract中cppan.yml文件最后面的

dependencies:
  private:
    # tesseract uses leptonica only internally
    # and does not expose its interface to users
    pvt.cppan.demo.leptonica: master

就是指定依赖,这里自然就是Leptonica;后面的master即版本,这里需要最新版,所以直接就是master了。

细心的读者可能会问,那libpng,libtiff等依赖呢?现在只解决了Tesseract对Leptonica的依赖,那Leptonica对libpng等的依赖呢?其实这个也早已解决,去GitHub看看Leptonica的源码,是不是也有熟悉的cppan.yml?看看文件最末尾

dependencies:
  pvt.cppan.demo.gif: 5 # any 5.x.x version
  pvt.cppan.demo.jpeg: "*" # any non branch version
  pvt.cppan.demo.png: 1
  pvt.cppan.demo.tiff: 4
  pvt.cppan.demo.webp: "*" # any non branch version

是不是这些依赖也解决了?

CMake

CMake对于Linux开发者会比较熟悉,但对于Windows还是比较新鲜的吧。CMake的全称是“cross platform make”,简单来说CMake通过读取CMakeLists.txt配置文件,在Linux下就能生成Makefile,而在Windows下,就能生成Visual Studio项目和解决方案,神奇吧?

关于CMake的细节这里就不多说了,只简单说说和本文相关的。CPPAN只是帮我们下载好了依赖,对依赖的配置就是交给CMake了,准确来说,是在CMakeLists.txt中配置的。CMakeLists.txt中指定在解决方案内创建哪些项目,项目间的依赖关系,include哪些文件,VS编译时生成静态库、动态库还是可执行文件;总的来说,就是CMake根据CMakeLists.txt的要求,给你生成指定版本(Visual Studio版本,x86,x64)的Visual Studio解决方案,在Visual Studio中打开就能用。

准备

整个过程除Visual Studio 2015外,还需要一些软件的协助:

  • Git(不用也可以,直接下载.zip的Tesseract源码)
  • CPPAN(加入PATH)
  • CMake(加入PATH)

编译

x86

照着wiki中的来

git clone https://github.com/tesseract-ocr/tesseract tesseract
cd tesseract
cppan
mkdir build
cd build
cmake ..

这时在build文件夹内就出现了tesseract.sln文件,双击就可以在Visual Studio 2015(Tesseract 3.05要求Visual Studio 2015)内打开解决方案,选择“Debug”或“Release”,然后在解决方案资源管理器中tesseract项目(不是tesseractmain项目)上点击右键,选择“生成”,等待编译完成就会看到输出

3> 正在创建库 C:/test5/tesseract/build/Release/tesseract305.lib 和对象 C:/test5/tesseract/build/Release/tesseract305.exp

3> tesseract.vcxproj -> C:test5tesseractbuildbinReleasetesseract305.dll

========== 全部重新生成: 成功 3 个,失败 0 个,跳过 0 个 ==========

tesseract305.dll生成成功啦!

x64

上面生成的tesseract305.dll只能用于32位版(并不是只能用于32位的Windows,而是需要用到此DLL的环境),如果需要64位版,只需要修改上述x86版的其中一个地方,完整的命令为

git clone https://github.com/tesseract-ocr/tesseract tesseract
cd tesseract
cppan
mkdir build
cd build
cmake -G "Visual Studio 14 Win64" ..

-G即指定CMake的generator,Visual Studio 14即Visual Studio 2015,Win64即64位。

编译错误“文本后缀无效”

编译时可能会遇到

文本后缀“銆”无效;未找到文文本运算符或文本运算符模板“operator """"銆”

的错误,不要慌,这里只是文件编码问题,由来已久的UTF-8和Windows简体中文版的GB2312问题。双击此错误会跳到出错的文件,这时在Visual Studio菜单栏上点击“文件”->“高级保存选项”,在“编码”下拉框选择“简体中文(GB2312)”,然后“确定”即可。重新编译就没问题啦!

小结

整个过程是不是异常简单?不仅如此,这种方法还不会遇到Tesseract或者依赖库版本过老的问题(因为全都用的master分支)。这里没有详述CMakeLists.txt中的关键语句,如果你感兴趣可以自己去找相关资料。

参考