在 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 是唯一一个似乎接近解决方案的方法。
我也尝试过以下方法但没有成功:
- 直接使用
添加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_directories
或 link_directories
。完全忘记那些命令的存在。
此代码将尝试在 Tesseract CMake 包中找到 Tesseract::libtesseract
目标。如果不能,它将为 Tesseract 寻找 pkg-config 模块。如果找不到,则构建失败 (REQUIRED
),但如果可以,pkg_check_modules
命令将创建 PkgConfig::tesseract
导入目标。 add_library(.. ALIAS ..)
命令添加一个别名使目标名称匹配,无论哪种方法成功。
然后您使用 target_link_libraries
将您的应用程序 link 应用到 Tesseract。 CMake 将为您处理使用要求(即 link 并包括目录、编译器标志等)。
我正在尝试编译一个需要 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 是唯一一个似乎接近解决方案的方法。
我也尝试过以下方法但没有成功:
- 直接使用 添加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_directories
或 link_directories
。完全忘记那些命令的存在。
此代码将尝试在 Tesseract CMake 包中找到 Tesseract::libtesseract
目标。如果不能,它将为 Tesseract 寻找 pkg-config 模块。如果找不到,则构建失败 (REQUIRED
),但如果可以,pkg_check_modules
命令将创建 PkgConfig::tesseract
导入目标。 add_library(.. ALIAS ..)
命令添加一个别名使目标名称匹配,无论哪种方法成功。
然后您使用 target_link_libraries
将您的应用程序 link 应用到 Tesseract。 CMake 将为您处理使用要求(即 link 并包括目录、编译器标志等)。