link 和 include lib-leptonica 如何在跨平台 make 文件中?

How does one link and include lib-leptonica in a cross platform make file?

我有以下 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 包含一直到 leptonica 源目录,而不是在它之前一站(正确?不正确?)。


好的,很好。但是,一个大问题。我的 C++ 源文件要求我删除包含的 leptonica

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

我会在 non-cross-platform 制造的开发机器上,kludge。


但是,理想情况下 该项目实施了最佳 cross-platform 实践,以便 leptonica 路径保留在包含中。

鉴于 CMake + leptonica 和来自 tesseract 的源代码示例都对如何包含 leptonica 存在分歧......(事实上我不同意包括第 3 方 headers 就好像它们在本地源目录中一样)。

However, ideally this project has best cross-platform practices implemented...

那就是:

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)

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

... implemented such that the leptonica path remains in the inclusion.

现在,上游 leptonica 将 include/leptonicainclude 目录都注入到您的包含路径中,但 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 ()

这将尝试匹配以“[/\]leptonica”结尾的路径,并将其父级添加到导入目标的包含列表的开头。

如果你是认真的cross-platform,那么忘记 PkgConfig。 为什么不只使用 cmake?

find_package(Leptonica REQUIRED)