如何通过CMake将Tesseract与OpenCV打包进自定义.so库?
实现将Tesseract与OpenCV打包进单个.so库的CMake配置
要把Tesseract、OpenCV和自定义代码打包成单个动态库,核心思路是链接静态版本的Tesseract和OpenCV库,确保所有依赖都被嵌入到最终的.so文件中。以下是具体步骤和配置示例:
1. 准备静态依赖库
首先要确保能获取到Tesseract、OpenCV(及依赖的Leptonica)的静态库文件:
- 若使用预编译包,需确认包中包含
.a格式的静态库; - 若自行编译,编译OpenCV时开启
BUILD_STATIC_LIBS选项,编译Tesseract/Leptonica时设置BUILD_SHARED_LIBS=OFF,生成静态库。
2. 修改CMakeLists.txt关键配置
基础配置
强制CMake优先查找静态库,并启用位置无关代码(静态库必须开启此选项才能嵌入动态库):
cmake_minimum_required(VERSION 3.10) project(MyOCRLib) # 优先查找静态库 set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) # 启用位置无关代码(必须) set(CMAKE_POSITION_INDEPENDENT_CODE ON)
查找静态依赖
通过find_package定位OpenCV、Tesseract和Leptonica的静态库:
# 查找OpenCV静态库(按需指定需要的组件) find_package(OpenCV REQUIRED COMPONENTS core imgproc highgui STATIC) if(NOT OpenCV_FOUND) message(FATAL_ERROR "未找到OpenCV静态库") endif() # 查找Tesseract和Leptonica静态库 find_package(Tesseract REQUIRED) find_package(Leptonica REQUIRED) if(NOT Tesseract_FOUND OR NOT Leptonica_FOUND) message(FATAL_ERROR "未找到Tesseract或Leptonica静态库") endif()
构建自定义动态库
添加自定义代码源文件,并链接所有静态依赖(注意处理系统级依赖):
# 添加自定义代码源文件 add_library(MyOCRLib SHARED src/my_ocr_core.cpp src/image_processing.cpp # 其他自定义源文件 ) # 链接所有依赖,使用--whole-archive确保静态库符号不被丢弃 target_link_libraries(MyOCRLib PRIVATE -Wl,--whole-archive ${OpenCV_LIBS} ${Tesseract_LIBRARIES} ${Leptonica_LIBRARIES} -Wl,--no-whole-archive # 系统级依赖(根据实际情况调整) pthread m dl ) # 设置库输出路径(可选) set_target_properties(MyOCRLib PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib )
3. 关键注意事项
- 链接器选项
--whole-archive:默认情况下,链接器会丢弃静态库中未被自定义代码直接引用的符号,导致运行时缺失依赖。此选项强制包含静态库的所有目标文件,避免此类问题; - 交叉编译适配:如果是跨架构编译,需在工具链文件中指定Tesseract、OpenCV静态库的交叉编译路径,确保CMake能正确找到对应架构的静态库;
- 依赖验证:生成库后,使用
ldd libMyOCRLib.so命令检查,输出中应仅包含系统级动态库(如libc.so、libpthread.so),无OpenCV或Tesseract的动态库依赖。
内容的提问来源于stack exchange,提问作者Ottunger
相关产品推荐
相关产品推荐

