在 CMAKE 项目中使用 Tesseract

Posted

技术标签:

【中文标题】在 CMAKE 项目中使用 Tesseract【英文标题】:Use Tesseract in CMAKE project 【发布时间】:2021-01-30 15:59:51 【问题描述】:

我正在尝试编译一个需要 Tesseract 和 OpenCV 的 cmake 项目。一切都在 Ubuntu 20.04 中完成。 但我一直在努力编译它。 我从源代码编译了 Tesseract,并且浏览了几篇 SO 帖子和我在网上找到的任何文章,但仍然没有运气。我注意到 Tesseract 不会在/usr/local/lib/cmake/ 下导出.cmake 文件,所以你不能这样做find_package(Tesseract x.x.x REQUIRED)

环顾四周,我发现人们建议这样做:

find_package(PkgConfig REQUIRED)
pkg_search_module(TESSERACT REQUIRED tesseract)
pkg_search_module(LEPTONICA REQUIRED lept)
include_directories($TESSERACT_INCLUDE_DIRS)
include_directories($LEPTONICA_INCLUDE_DIRS)
link_directories( $TESSERACT_LIBRARY_DIRS )
link_directories( $LEPTONICA_LIBRARY_DIRS )

这似乎找到了一些东西。在执行pkg_search_module(TESSERACT REQUIRED tesseract) 之后,我可以看到TESSERACT_INCLUDE_DIRS 填充了这个列表:/usr/local/include;/usr/include/leptonica。尽管 Tesseract 头文件位于/usr/local/include/tesseract/ 下,但还是会这样做。无论如何,运行cmake 不会出错。

但是,之后运行make 只会添加一些奇怪的错误

error: 'l_int32' does not name a type; did you mean 'u_int32_t'?
   54 |     l_int32        num;       /*!< number of unknowns                     */
      |     ^~~~~~~

到我的项目。即使我什至没有包含任何 Tesseract 或 Leptonica 的头文件。

This 帖子是唯一似乎接近解决方案的帖子。

我也尝试了以下方法但没有成功:

直接使用添加 Tesseract 和 Leptonica 头文件的路径
include_directories(/usr/local/include/tesseract/)
include_directories(/usr/local/include/leptonica/)
还尝试制作自己的.cmake 文件,以便我可以直接使用find_package(Tesseract 4.1.1 REQUIRED)。 我什至尝试从源代码编译 Leptonica 库,但这无济于事。 阅读 Tesseract 项目本身的 cmake file 也没有对此有所了解。

【问题讨论】:

【参考方案1】:

不幸的是,Ubuntu 的 libtesseract-dev 软件包没有捆绑其 CMake 配置文件。但这并不意味着您不应该先寻找它们。

find_package(Tesseract 4)
if (NOT Tesseract_FOUND)
    find_package(PkgConfig REQUIRED)

    pkg_check_modules(Tesseract REQUIRED IMPORTED_TARGET tesseract lept)
    add_library(Tesseract::libtesseract ALIAS PkgConfig::Tesseract)
endif ()

# ... later ...
target_link_libraries(my_app PRIVATE Tesseract::libtesseract)

始终使用导入的目标从不 使用include_directorieslink_directories。根本忘记那些命令。

此代码将尝试在 Tesseract CMake 包中查找 Tesseract::libtesseract 目标。如果不能,它将为 Tesseract 寻找 pkg-config 模块。如果找不到,则构建失败(REQUIRED),但如果可以,pkg_check_modules 命令将创建 PkgConfig::tesseract 导入的目标。 add_library(.. ALIAS ..) 命令添加一个别名,以使目标名称匹配,无论哪种方法成功。

然后您使用target_link_libraries 将您的应用程序链接到 Tesseract。 CMake 将为您处理使用要求(即链接和包含目录、编译器标志等)。

【讨论】:

我想我应该这样做pkg_check_modules(Tesseract REQUIRED IMPORTED_TARGET GLOBAL tesseract lept)。因为否则我会得到一个错误:add_library cannot create ALIAS target "Tesseract::libtesseract" because target "PkgConfig::Tesseract" is imported but not globally visible. 您正在运行旧版本的 CMake。升级,或者在IMPORTED_TARGET之后添加GLOBAL 谢谢。 :) 是的,我想通了。我有 cmake 3.16 版。 什么是最低 cmake 版本,您不必在其中添加“GLOBAL”? @jwezorek 3.18 版。在此处查看发行说明:cmake.org/cmake/help/latest/release/3.18.html

以上是关于在 CMAKE 项目中使用 Tesseract的主要内容,如果未能解决你的问题,请参考以下文章

在qbs项目中添加子模块(使用cmake构建)

如何在 CMake GUI 中显示 FooConfig.cmake 文件中的 CMake 变量?

可以在目录 CMake 中使用整个项目的导入

如何在 CMake 项目中使用外部 DLL

如何使用CMake构建c++项目

使用命令行在 Visual Studio 2019 中打开 CMake 项目