在 CMAKE 项目中使用 Tesseract

Use Tesseract in CMAKE project

我正在尝试编译一个需要 Tesseract 和 OpenCV 的 cmake 项目。一切都在 Ubuntu 20.04 中完成。 但是我一直在努力编译它。 我从源代码编译了 Tesseract 并浏览了几个 SO posts 和我在网上找到的任何文章,但仍然没有运气。我注意到 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 post 是唯一一个似乎接近解决方案的方法。

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

include_directories(/usr/local/include/tesseract/)
include_directories(/usr/local/include/leptonica/)

所以 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 将您的应用程序 link 应用到 Tesseract。 CMake 将为您处理使用要求(即 link 并包括目录、编译器标志等)。