【问题标题】:Use Tesseract in CMAKE project在 CMAKE 项目中使用 Tesseract
【发布时间】: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 也没有对此有所了解。

【问题讨论】:

    标签: cmake tesseract leptonica


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2016-02-22
    • 2021-08-23
    • 2019-06-21
    相关资源
    最近更新 更多