在 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_directories
或link_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的主要内容,如果未能解决你的问题,请参考以下文章