微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 CMAKE 项目中使用 Tesseract

如何解决在 CMAKE 项目中使用 Tesseract

我正在尝试编译一个需要 Tesseract 和 OpenCV 的 cmake 项目。一切都在 Ubuntu 20.04 中完成。 但我一直在努力编译它。 我从源代码编译了 Tesseract,并浏览了几篇 SO 帖子和我在网上找到的任何文章,但仍然没有运气。我注意到 Tesseract 不会在 .cmake 下导出 /usr/local/lib/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 也没有对此有所了解。

解决方法

不幸的是,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 将为您处理使用要求(即链接和包含目录、编译器标志等)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。