资讯动态

Windows 10下用CMake编译Tesseract并集成到VS2019 C++工程

发布时间:2026/10/17 3:15:00 来源:尧图企业网站定制
很多人在Windows 10上第一次接触Tesseract OCR都是先装个官方安装包然后到命令行里跑一句tesseract image.png stdout发现英文数字识别效果不错中文勉强也能出字。可一旦你想把这个引擎正经集成到自己的C程序里问题立刻冒出来头文件在哪.lib文件在哪为什么官方安装包里什么都没有只有一大堆DLL原因说白了就一句话——官方Windows安装包只配送了命令行运行环境压根没给你开发期需要的头文件和导入库。想用Visual Studio 2019做二次开发必须自己下载源码通过CMake-GUI配置工程再交给编译器生成一整套可用的开发库。这篇文章就把Windows 10下从零编译Tesseract、再集成到C工程的完整流程拆开讲包括CMake-GUI里每一项该怎么选、Visual Studio 2019里怎么配置、踩过哪些坑全部按实际操作的顺序来。1. 编译前的准备这套方案到底解决什么问题1.1 为什么官方安装包满足不了C开发需求先说个很多人都经历过的场景安装完官方Windows安装包后你在安装目录里能看到tesseract.exe旁边还有几个DLL比如tesseract.dll、leptonica.dll看起来挺齐全。可是当你新建一个Visual Studio工程想#include tesseract/baseapi.h的时候却发现根本找不到这个头文件。去安装目录翻了一圈确实没有include目录。这就是命令行版和开发版的本质区别官方安装包是给终端用户跑识别用的不是给程序员做链接用的。你可能想说那直接用动态加载DLL的方式行不行能行但非常痛苦。你需要自己声明TessBaseAPI类的所有导出函数签名处理C的name mangling还得手动构造调用约定等于自己重写一遍头文件。而且Tesseract的API是一整个类体系手动声明几十个方法光想想就不现实。更别提Leptonica那边还有一整套图像数据结构全手动声明根本不可维护。所以最靠谱的路就一条自己编译源码让CMake替我们生成标准的导入库和头文件之后在VS里就像用普通的第三方库一样#include 链接库完事。这条路其实没有想象中复杂。核心工作量集中在两件事一是用CMake-GUI把源码转化成Visual Studio解决方案二是在生成的解决方案里点几下编译。整个过程唯一的门槛就是你要理解几个CMake选项分别是什么意思剩下的都是重复劳动。1.2 需要准备的软件与源码清单这套方案涉及的软件不多但版本之间需要匹配我按实际踩坑经验列一个清单Visual Studio 2019安装时一定要勾选“使用C的桌面开发”工作负载否则没有MSVC编译器和Windows SDK。装的时候顺手把“适用于最新v142生成工具的C ATL”这类可选组件也勾上虽然主要用不到但保不齐后面某个库需要。CMake建议装3.20以上的版本太老的话可能不认识Tesseract 5.x的CMakeLists语法。CMake安装时勾选“Add CMake to the system PATH for all users”后面命令行操作更方便。Git不是必须但强烈建议装。Tesseract和Leptonica的源码都在开源仓库里用git clone拉代码比手动下载zip包好太多而且某些依赖组件在Configure阶段也可能需要Git。装上之后就算不用命令行CMake-GUI也能找到它。Tesseract源码建议用5.x分支功能和4.x基本一致但对新硬件的优化更好。标签可以选择最新的稳定版本比如5.3.x。Leptonica源码Tesseract的图像处理底层依赖必须提前编译好。Leptonica 1.82以上版本和Tesseract 5.x配合得比较好我实测1.82基本没有兼容问题。我的目录规划是这样的在D盘建一个D:\dev\3rdparty作为所有第三方库的根目录里面分别放tesseract-src、leptonica-src再各建一个build目录放CMake生成的工程。这样做的好处非常明显源码目录保持干净构建产物全部落在build里后面想删除重编直接清空build即可源码还能留着改选项。Windows上有一些开发者的home目录带中文用户名CMake在解析路径时偶尔会罢工所以源码路径我强烈建议全英文且不要有空格。1.3 编译顺序为什么是先Leptonica后Tesseract很多人第一次自己编译Tesseract上来就直接Configure结果报了一个“找不到Leptonica”的错误当场懵掉。这其实是没理解编译依赖关系Tesseract的CMake工程在配置阶段就会调用find_package(Leptonica)去找一个名为LeptonicaConfig.cmake的文件。这个文件是Leptonica自己构建并安装时生成的你机器上如果没有编译过LeptonicaTesseract的CMake配置就没有任何线索。所以先编Leptonica再用CMake-GUI指给它看“Leptonica在这”Tesseract才能顺利Configure。2. 用CMake-GUI编译Leptonica给Tesseract打好地基2.1 第一次Configure与生成器选择打开CMake-GUI界面很直白上面两个输入框一个叫“Where is the source code”一个叫“Where to build the binaries”。把Leptonica源码目录填到第一个——注意要填源码根目录不是里面的子目录第二个填D:\dev\3rdparty\leptonica-build。这个build目录不需要提前创建CMake会自己建。点Configure按钮第一次会弹一个对话框问生成器。这里千万别选错Visual Studio 2019对应的是“Visual Studio 16 2019”下面还有个Optional platform for generator一定要选x64。如果你默认选成了Win32后面生成的库都是32位的跟你的64位工程对接的时候全乱套。我见过不止一个开发者在选生成器这步翻车生成完才发现平台是Win32编译出来的库没法用又回来重新Configure一遍。选完生成器CMake开始第一次配置界面会刷出一堆红色条目。别紧张红色不代表错误只是表示这些变量还没有缓存值是首次配置的正常状态。等进度条走完红色条目数量会显著减少剩下的就是不认识或者有依赖问题的变量了。2.2 三个值得手动修改的Leptonica选项第一次Configure结束后关注下面几个选项按需调整CMAKE_INSTALL_PREFIX这是安装路径决定了编译完的Leptonica库会复制到哪个目录。默认是C:\Program Files (x86)\leptonica不建议用。改成D:/dev/3rdparty/leptonica-install这相当于Leptonica的“成品区”。注意这里用的是正斜杠CMake对反斜杠也能处理但正斜杠更稳。BUILD_PROG如果看到这个选项默认是ON会生成一堆可执行示例工具。这些工具对Tesseract编译完全没用还白白拖长编译时间直接改成OFF。SW_BUILD_PROG另一个示例程序开关同样改成OFF。至于图片格式相关的依赖项比如PNG_DIR、JPEG_DIR、TIFF_DIR这几个变量第一次完全可以不填。Leptonica在没有这些库支持时也能编译通过只是生成的库读取PNG、JPEG能力受限。第一次编译的目的就是先把Tesseract链接跑通测试识别时可以先用BMP格式的图片等流程走顺了再回来补这些格式支持。我后来补JPEG和PNG支持时才发现要先去下载对应的开发库再用CMake指定它们的路径然后重新Configure一遍Leptonica这个流程也不复杂但不用全挤在头一次。改完选项再次点Configure等红色条目全部变成白色没有报错就可以点Generate生成Visual Studio工程了。Generate会把.sln和一堆.vcxproj文件写进build目录。2.3 编译与安装LeptonicaGenerate完成后点Open Project按钮会直接用Visual Studio打开生成的sln。如果手滑没找到这个按钮也可以自己去build目录里找Leptonica.sln双击打开。在Visual Studio里要做三件事把解决方案配置从Debug改成Release平台从Win32改成x64。这个步骤很多人会忘默认是DebugWin32编译出来接口完全对不上。右键ALL_BUILD项目点生成。首次编译大概要两三分钟主要取决于机器性能。中间会刷出大量warning比如C4996这类安全性警告不影响最终结果可以先忽略。右键INSTALL项目点生成。这步会把编译好的头文件、静态库/动态库复制到之前设的CMAKE_INSTALL_PREFIX目录。完成之后去D:\dev\3rdparty\leptonica-install看一眼理想情况下能看到三个子目录include里是头文件lib里有库文件bin里有DLL。这时候Leptonica部分就结束了别看它简单它是后面Tesseract能顺利Configure的最大前提。提示Leptonica编译时如果报找不到zlib.h这类错误说明你系统里缺少Zlib开发库。这个库属于基础依赖最好装上。但是网上很多预编译Zlib包的头文件路径写得七零八落反而比编译Leptonica本身还折腾。我的建议是先把Leptonica核心编过Zlib缺失导致的问题大多是某个图片格式支持不完整不会卡死在编译阶段。3. CMake-GUI配置Tesseract核心选项逐个拆解3.1 填入路径并生成VS工程编译完Leptonica回到CMake-GUI这次处理Tesseract。源码目录填D:\dev\3rdparty\tesseract-src构建目录填D:\dev\3rdparty\tesseract-build。点Configure依旧选择“Visual Studio 16 2019”x64。第一次Configure大概率会直接报错错误信息类似Could not find a package configuration file provided by Leptonica。这很正常因为Tesseract不知道你的Leptonica装在哪。解决方式是在CMake-GUI的搜索框里输入Leptonica找到Leptonica_DIR这个变量把它设置成上一步安装目录里LeptonicaConfig.cmake所在的路径。我机器上是D:/dev/3rdparty/leptonica-install/lib/cmake/Leptonica。设置完再次点Configure如果红色条目数量明显减少说明Leptonica的路径识别成功了。此时不用着急点Generate先在列表里过一遍Tesseract自己的选项有几个直接影响后续的使用体验。3.2 六个决定“好不好用”的CMake选项Tesseract的CMake选项比Leptonica多不少但绝大多数保持默认就够。真正需要你花心思的是下面这六个BUILD_TRAINING_TOOLS这个选项默认是ON它控制是否编译训练工具。如果你只是要识别文字不需要训练自己的OCR模型立刻改成OFF。开启它意味着多编译一堆工具程序时间长得让人怀疑人生我从一次开着它完整编译花了快二十分钟编译出的工具还大多用不上。BUILD_SHARED_LIBS改成ON生成DLL动态库。这个项目本身就是动态加载DLL的形式生成动态库方便后续部署。如果你想要静态链接可以把这里改成OFF但静态编译时还需要同时处理OpenMP等运行时依赖复杂度会高不少建议走动态库。BUILD_TESTS默认ON编译测试用例。跟训练工具一样可以改成OFF省时间也省磁盘空间。OPENMP建议保持ON。Tesseract的多线程加速依赖OpenMP开着对识别性能有肉眼可见的提升尤其是处理大图的时候。Visual Studio自带OpenMP支持只要C桌面开发组件齐全这个选项不会出幺蛾子。CMAKE_INSTALL_PREFIX设置为D:/dev/3rdparty/tesseract-install逻辑和Leptonica安装目录一致。STATIC这个选项默认是OFF。如果你之前把BUILD_SHARED_LIBS改成了OFF这里可能会自动变成ON。具体规则不用深究反正只要保持一致就行。这里特别提醒一句BUILD_TRAINING_TOOLS千万别忽略。我头一次编译就忽略了这个选项结果整个解决方案里多出好几个以tesseract_train开头的工具项目。编译它们需要额外的依赖而且经常触发一些奇怪的头文件错误。把它们关掉之后编译一下就顺畅多了。3.3 Release x64编译与安装Configure全部通过后点Generate再点Open Project。Visual Studio打开后还是那套操作解决方案配置改成Release平台是x64右键ALL_BUILD生成。Tesseract的编译时间明显比Leptonica长全量编译大概5到10分钟具体看机器。如果只关心主体功能可以单独右键tesseract项目、tesseractmain等项目而不是整个ALL_BUILD。但第一次建议还是全部编一遍省得后面缺文件了我还以为是编译问题。编译完成后右键INSTALL运行把产物统一复制到D:/dev/3rdparty/tesseract-install。打开这个目录应该能看到bin目录tesseract.exe、tesseract.dll、leptonica.dllinclude目录头文件lib目录tesseract.lib等导入库这里有个细节很多人编译完想立刻在命令行里试一下tesseract --version于是跑到bin目录手动执行。如果直接双击或裸敲命令大概率报错找不到tesseract.dll因为bin目录里虽然有三个DLL但系统加载器可能找不到。解决办法是把bin目录加到系统环境变量PATH里或者先靠命令行cd到bin再执行tesseract.exe。还要记得把语言包拷过来。Tesseract的识别能力全靠traineddata文件和引擎本身是分开的。初始模型文件可以从开源仓库的tessdata_fast目录下载也可以下载完整版tessdata。我建议先下tessdata_fast里的eng.traineddata、chi_sim.traineddata把它们放到bin/tessdata目录下。测试识别时随便找张图片跑一遍能输出文字说明引擎本身没问题。4. 新建C工程把Tesseract集成进你的程序4.1 一步步配置VS2019项目属性编译好的库必须在Visual Studio工程里配置好才能正常使用。新建一个空项目在项目属性页里要配三样东西第一附加包含目录。打开项目属性 - C/C - 常规 - 附加包含目录加上D:/dev/3rdparty/tesseract-install/include和D:/dev/3rdparty/leptonica-install/include。Tesseract的头文件通过相对路径引用Leptonica的头文件比如baseapi.h里面会#include leptonica/allheaders.h所以两个include目录都不能少。少了一个编译报错会非常奇怪——找不到allheaders.h然后你看着明明Leptonica收入了却不知道哪里错了。第二库目录。打开链接器 - 常规 - 附加库目录加上D:/dev/3rdparty/tesseract-install/lib和D:/dev/3rdparty/leptonica-install/lib。第三附加依赖项。打开链接器 - 输入 - 附加依赖项加上tesseract.lib和leptonica.lib。这里要注意实际生成库文件时Debug配置和Release配置的lib名字可能有区别。尤其是Leptonica的CMake有时生成带平台后缀的库名比如leptonica-1.82.lib或者Debug版本加个d后缀。最稳的办法是打开两个lib目录看一眼实际文件名照着填。我用的是Release版实际生成的tesseract.lib和leptonica.lib没有额外的后缀。如果运行时报找不到DLL还需要把tesseract-install/bin和leptonica-install/bin这两个目录加进环境变量PATH或者把里面的三个重要DLL直接复制到你的exe输出目录。对开发调试来说加PATH更省事对发布分发来说DLL放exe同目录更干净。4.2 写一段能跑的Demo代码环境配置好跑一个最小识别例子#include iostream #include tesseract/baseapi.h #include leptonica/allheaders.h int main(int argc, char** argv) { if (argc 2) { std::cerr Usage: ocr_demo image_path std::endl; return 1; } Pix* pix pixRead(argv[1]); if (!pix) { std::cerr Failed to read image: argv[1] std::endl; return 1; } tesseract::TessBaseAPI api; if (api.Init(nullptr, engchi_sim)) { std::cerr Failed to initialize tesseract std::endl; pixDestroy(pix); return 1; } api.SetImage(pix); api.SetVariable(tessedit_pageseg_mode, 6); char* text api.GetUTF8Text(); std::cout OCR result:\n text std::endl; delete[] text; api.End(); pixDestroy(pix); return 0; }这段代码做了四件事先用Leptonica的pixRead把图片读成一棵Pix数据结构再用TessBaseAPI初始化引擎接着把图像交给引擎识别最后取出UTF-8文本打印出来。这里每个环节都能单独报错pixRead返回NULL说明图片路径不对或者格式不支持api.Init返回非0说明tessdata目录找不到或语言包缺失。关于api.Init的第一个参数我传了nullptr。这表示让Tesseract自己去默认位置找tessdata目录。默认位置是编译时设置的一般就是安装目录下。如果你想明确指定自己的语言包目录可以传一个路径字符串比如D:/dev/3rdparty/tessdata这种情况下传入的路径要指向包含eng.traineddata的上一级目录也就是说路径末端不是tessdata本身而是它的父目录。这个细节经常有人搞反导致Init一直失败。语言参数engchi_sim表示同时加载英文和简体中文模型。如果你只需要英文直接写eng。这个加号的语法要记住不是逗号不是分号就是加号。我见过有人用逗号分隔结果引擎只加载了第一部分语言识别中文全是乱码排查半天才发现是语言参数传错了。SetVariable(tessedit_pageseg_mode, 6)这行设置页面分割模式为“把图像当成一块统一文本块”。如果图片是一段规整的段落文字模式6识别效果最好。如果图片很乱有多个区域用默认的模式3反而更稳。这个参数后面在调识别率时经常用到。4.3 语言包、运行环境与发布注意事项tessdata这个目录是整个识别链路里最容易出问题的一环。很多人程序编好了引擎也初始化了但识别结果却乱码满屏大部分原因是语言包版本或路径不对。Tesseract 5.x对语言包有严格的版本要求老的4.x语言数据虽然名字一样但内部格式可能不兼容引擎Init时会拒绝加载或者直接崩溃。发布的时候你的程序依赖清单可以精简到四样东西你的exe、tesseract的DLL、leptonica的DLL、tessdata目录。不推荐把整个tesseract-install目录原封不动发给用户太臃肿。但是精简时要小心Tesseract运行期还会依赖VC运行时库如果目标机器没有装过Visual C Redistributable可能一启动就报“无法定位程序输入点”。最稳妥的做法是用Visual Studio发布工具自带的“Release”配置编译并且确认链接到了动态版本的VC运行时然后把那几个运行时DLL一起带走或者提示用户先装运行库。5. 常见问题与避坑实录5.1 Configure阶段的高频报错我在多个版本的CMake-GUI上编译过Tesseract遇到过几类基本问题。找不到Leptonica这类报错最常见重点检查Leptonica_DIR是否真的指向了包含LeptonicaConfig.cmake的目录。有时Leptonica安装目录里同时存在好几种名字的cmake文件如果你指向了lib/cmake而不是lib/cmake/Leptonica还是会找不到。不要凭感觉填打开目录看一眼文件在哪再填。缺少Git导致的Configure失败Tesseract 5.x的CMake在某几个步骤需要从网上下载少量脚本数据如果系统没有Git环境Configure直接就红了。我当时在机子上装了Git但CMake找不到它因为CMake不会自动扫描所有安装位置需要在CMake-GUI里把GIT_EXECUTABLE手动设置成C:/Program Files/Git/bin/git.exe这类路径。这个问题很隐蔽因为装了Git的人默认不会觉得问题出在Git上。编译器版本识别失败如果Configure阶段提示找不到MSVC编译器说明Visual Studio安装时缺少“使用C的桌面开发”组件。打开Visual Studio Installer把那个工作负载勾上补装完再重新打开CMake-GUI这次会自动识别。5.2 编译链接阶段最常踩的坑LNK2019未解析的外部符号这大概是所有C集成Tesseract的开发者都会碰一回的问题。报错形式五花八门核心就是某个函数声明了但链接器不知道去哪找实现。排查顺序先看附加依赖项有没有写对lib文件名再看Debug/Release是否匹配最后看编译配置目标平台是不是x64。我遇到过一次特别隐蔽的tesseract.lib链接上了但leptonica.lib写了带版本后缀的旧文件名而系统里实际生成的库已经是新版名字。删掉重写附加依赖项就解决了。C4996安全问题警告Tesseract部分函数使用了旧版C运行时APIVS2019默认会报警告。这些警告全是噪音不处理也行。实在看着难受在项目属性 - C/C - 命令行 - 附加选项中加一句_CRT_SECURE_NO_WARNINGS预处理器定义即可。OpenMP链接错误如果你在CMake里勾了OpenMP但在链接阶段报找不到vcomp140之类的内容说明VS的OpenMP运行库没装全。一般补装“C ATL”组件能解决实在不行可以关掉OpenMP重新编译只是性能会打折扣。5.3 识别效果相关的排查思路中文识别乱码先确认语言包真在tessdata里而且和引擎版本匹配。再确认Init的语言参数加号写对。最后检查控制台输出用的是不是UTF-8编码。Windows控制台默认GBK编码如果直接打印UTF-8文本会显示成乱码但把文本写入文件再打开往往是正常的。这不是Tesseract的问题是终端编码的问题。小图片识别率低图片里文字只有二三十个像素高Tesseract很难识别。我本地的经验是把图片先用Leptonica的pixScale按2到3倍放大识别成功率会明显提升。比如Pix* bigPix pixScale(pix, 2.0, 2.0)然后再送进Tesseract。很多人一上来就怪语言包不好用其实先把图像预处理做好更有效。只想识别数字或字母用api.SetVariable(tessedit_char_whitelist, 0123456789)限定字符集识别率会高很多。尤其是验证码类图片加这个白名单能过滤掉一大堆干扰。5.4 运行阶段看似诡异的小问题“找不到tesseract.dll”程序编译通过一运行就弹这个。原因是DLL搜索路径没覆盖到tesseract-install/bin。最省事的是把exe输出目录直接设成和DLL同目录或者把DLL复制到exe旁边。加环境变量也行但改完要重启Visual Studio或终端才生效。Init返回-1几乎都是因为没有找到tessdata目录。如果Init传入的是nullptr引擎默认去编译时记录的相对路径找。这个路径在安装目录里是bin/tessdata。如果你把exe复制到别处跑可能就找不到了。这时最好显式传入tessdata的父目录路径让逻辑不受工作目录影响。图片格式不支持如果你用PNG或JPEG图片时pixRead一直返回NULL多半是之前编译Leptonica时没开启对应格式支持。最简单的检查方式是先用BMP图片测试BMP是Leptonica原生支持的格式不依赖任何第三方解码库。确认整个流程能跑通后再回去补编译PNG/JPEG支持。我个人在实际操作中的体会是整体编译Tesseract的核心不在编译动作本身而在搞清楚每一层依赖关系Leptonica是底层Tesseract是上层语言包是数据层开发工程是应用层。很多人卡在某个报错上死磕很久其实只是因为少配了一个Leptonica_DIR或者少关了一个BUILD_TRAINING_TOOLS。这套流程你完整跑过一次之后再去看CMake-GUI里那些选项就不再是一堆天书一样的变量了。下次不管是换一个新版本的Tesseract还是想在别的机器上重复搭建环境沿着这个思路走一遍都能快速搞定。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑