我正试图编译一个需要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的头文件。
这篇文章似乎是唯一一个接近解决方案的。
我还尝试了以下操作,但没有成功:
- 直接使用 添加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文件也没有阐明这一点。
所以很遗憾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将处理使用需求(例如:链接和包含目录,编译器标志等)。