如何在一个跨平台的文件中链接并包含libleptonica



我有以下cmake命令:

include(FindPkgConfig)

# ditto for tesseract
pkg_search_module(LEPT lept)
find_library(
LEPT
NAMES leptonica liblept liblept-dev lept
HINTS ${LEPT_INCLUDE_DIRS} ${LEPT_LIBRARY_DIRS}
)

// ditto for tesseract
target_include_dirs(tess_api PRIVATE ${LEPT_INCLUDE_DIRS})
target_link_libraries(tess_api LINK_PRIVATE ${LEPT})

以及以下状态报告:

message(STATUS "LEPT: ${LEPT}")
message(STATUS "LEPT::INCLUDE: ${LEPT_INCLUDE_DIRS}")
message(STATUS "LEPT::LIBRARY: ${LEPT_LDFLAGS}")
message(STATUS "LEPT::CFLAGS: ${LEPT_CFLAGS}")

输出:

-- LEPTONICA: /usr/local/Cellar/leptonica/1.82.0/lib/liblept.dylib
-- LEPTONICA::INCLUDE: /usr/local/Cellar/leptonica/1.82.0/include/leptonica
-- LEPTONICA::LIBRARY: -L/usr/local/Cellar/leptonica/1.82.0/lib;-llept
-- LEPTONICA::CFLAGS: -I/usr/local/Cellar/leptonica/1.82.0/include/leptonica

其中,leptonica包含一直进入leptonic源目录,而不是在它之前一站(正确?不正确?(。


好的,太好了。然而,有一个大问题。我的C++源文件要求我删除包含的leptonica

#include "tesseract/..."  // like a charm
// #include "leptonica/allheaders.h" // WRONG!
#include "allheaders.h" // well this works :(

我想,在一台非跨平台的开发机器上,搞砸。


然而,理想情况下该项目具有最佳的跨平台实践,因此leptonica路径仍在包含中。

我不确定如何实现这一点,因为CMake+leptonica,以及tesseract的源示例都对如何包括leptonic存在分歧。。。(事实上,我不同意将第三方标头包含在本地源目录中的想法(。

然而,理想情况下,该项目实现了最佳的跨平台实践。。。

应该是这样的:

find_package(PkgConfig)  # Never include(Find<Anything>)
pkg_search_module(Tesseract REQUIRED IMPORTED_TARGET ...)
pkg_search_module(Leptonica REQUIRED IMPORTED_TARGET lept)
target_link_libraries(tess_api 
PRIVATE PkgConfig::Tesseract PkgConfig::Leptonica)

始终通过导入的目标链接到库。在实际的Find模块之外,基本上不需要find_library

。。。实现为使得leptonica路径保持在包含中。

现在,上游leptonica将include/leptonicainclude目录都注入到您的include路径中,但Homebrew似乎已经修补(窃听(了普通目录。解决这个问题的一种方法是编写

pkg_search_module(Leptonica ...)
# Work around common Leptonica packaging bugs...
if (";${Leptonica_INCLUDE_DIRS};" MATCHES ";([^;]+)[/\]leptonica[/\]?;")
target_include_directories(
PkgConfig::Leptonica BEFORE INTERFACE "${CMAKE_MATCH_1}")
endif ()

这将试图匹配以"0"结尾的路径;[/\]leptonica";并将其父对象添加到导入目标的包含列表的开头。

如果你对跨平台很认真,那么忘记PkgConfig。为什么不只使用cmake?

find_package(Leptonica REQUIRED)

最新更新