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/leptonica
和 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 ()
这将尝试匹配以“[/\]leptonica”结尾的路径,并将其父级添加到导入目标的包含列表的开头。
如果你是认真的cross-platform,那么忘记 PkgConfig
。
为什么不只使用 cmake?
find_package(Leptonica REQUIRED)
我有以下 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/leptonica
和 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 ()
这将尝试匹配以“[/\]leptonica”结尾的路径,并将其父级添加到导入目标的包含列表的开头。
如果你是认真的cross-platform,那么忘记 PkgConfig
。
为什么不只使用 cmake?
find_package(Leptonica REQUIRED)