源码编译PaddleOCR,4条路径搞定3个平台
【免费下载链接】PaddleOCR飞桨多语言OCR工具包(实用超轻量OCR系统,支持80+种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部署) Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR
/usr/bin/ld: CMakeFiles/ppocr.dir/src/ocr/system.cc.o: in function `SystemOCR::init()': undefined reference to `paddle::inference::Config::enable_gpu_memory_optimize' collect2: error: ld returned 1 exit status一句话说明:PaddleOCR C++ 编译链接失败最经典的现场——链接器找不到 PaddlePaddle 推理库的符号。
你在做 PaddleOCR 编译时多半踩过它:x86 服务器上一切顺利,换到 ARM 目标机交叉编译,undefined reference 立刻冒出来。多数情况下,锅不在代码,而在依赖没指对地方。
PaddleOCR 源码构建的完整流程,我们按你实际动手的先后顺序走一遍:先把工具链备齐,再分别走 Python 包和 C++ 推理库两条并行编译路径,然后是 ARM、Windows 上的 PaddleOCR 交叉编译坑,最后是性能调优和 Docker、CI 自动化。走完这套,Linux、Windows、ARM 三个平台你都能独立交付。
6条命令把依赖装齐并验证到位
编译这件事,第一步永远是备料。我们全文用做菜来打比方:依赖是食材,CMakeLists 是菜谱,make 是开火,链接是装盘。食材缺一味,菜谱再全也救不了你。
一键装齐:3个系统包与2个依赖路径
Ubuntu 20.04 上,最小工具链就是下面这组:
sudo apt-get update sudo apt-get install -y build-essential cmake git \ libopencv-dev protobuf-compiler # 推理库解压后,把两个变量指对位置 export PADDLE_LIB=/opt/paddle_inference/paddle export OPENCV_DIR=/usr/local/opencv4一句话说明:一条命令装好 GCC、CMake、Git、OpenCV 和 Protobuf 开发包,再把 PADDLE_LIB 和 OPENCV_DIR 两个路径指到位。
版本底线记住几个数:CMake 3.14 以上(deploy/cpp_infer/CMakeLists.txt开头就声明了这个下限)、GCC 7.5 以上、Python 3.8 以上。C++ 代码是 C++11 标准,编译器不用追新;OpenCV 建议上 4.x,仓库自带的官方构建脚本用的是 4.7.0。
PADDLE_LIB 指向的目录里必须有paddle/include、paddle/lib和third_party三块,少一块后面都要出幺蛾子。OPENCV_DIR 在 Linux 上要指向安装根目录——菜谱里找的是${OPENCV_DIR}/lib64/cmake/opencv4。直指 lib64 的话,configure 阶段就会报找不到 OpenCV。
用4行脚本验证推理库
备料完别急着开火,先确认食材是真货:
for f in ${PADDLE_LIB}/paddle/lib/libpaddle_inference.so \ ${OPENCV_DIR}/lib/libopencv_core.so; do [ -f "$f" ] && echo "OK $f" || { echo "MISSING $f"; exit 1; } done一句话说明:检查两个最关键的 .so 是否存在,缺一个就地报错退出,省掉后面 20 分钟的 make。
脚本通过,备料阶段结束。后面 C++ 编译卡住时,八成要回到这一步复查——头文件找不到、符号未定义,十有八九是路径问题。
两条并行编译路径,一个产wheel,一个产可执行文件
依赖就位后,两条路并行开工:Python 包装出 pip 可装的 paddleocr,C++ 路径产出一个叫 ppocr 的独立可执行文件。
Python路径:pip -e装可编辑,wheel出固定版
Python 包是标准 setuptools 构建,源码结构一眼看清:paddleocr/是推理入口,ppocr/管训练,ppstructure/管文档结构分析。
git clone https://gitcode.com/paddlepaddle/PaddleOCR cd PaddleOCR python -m pip install -e .一句话说明:克隆仓库后以可编辑模式安装,改了源码不用重装就生效,适合开发调试。
想要"固定版"而不是开发环境,换成 wheel 构建:
python -m pip wheel . -w dist/ python -m pip install dist/paddleocr-*.whl python -m pip install -e ".[doc-parser]" # 按需加功能模块 python -m pip install -e ".[all]" # 或者全都要一句话说明:从源码打 wheel 再安装,相当于把做好的菜密封打包;方括号 extras 决定装哪些菜。
两个细节。其一,pyproject.toml要求 setuptools 72.1.0、wheel、setuptools_scm,版本号由 setuptools_scm 从 git tag 推导——没有 tag 的分支打出来的 wheel 版本号会很奇怪,发版记得 checkout 带 tag 的提交。其二,功能模块按需安装:doc-parser、ie、trans、all四组 extras,装什么用什么,别把整个厨房端上桌。
要训练的话,还要装requirements.txt里那批(shapely、pyclipper、lmdb、opencv-python、rapidfuzz 等),pip install -r requirements.txt一条搞定。
C++路径:CMake配置一次,make -j产出ppocr
C++ 路径的入口是deploy/cpp_infer/目录,菜谱就是它下面的 CMakeLists.txt。PaddleOCR CMake 配置说白了就是传两个路径、拨四个开关:
cd deploy/cpp_infer mkdir -p build && cd build cmake .. \ -DPADDLE_LIB=${PADDLE_LIB} \ -DOPENCV_DIR=${OPENCV_DIR} \ -DWITH_GPU=OFF -DWITH_MKL=ON \ -DCMAKE_BUILD_TYPE=Release make -j$(nproc) ./ppocr --help一句话说明:把两个依赖路径传给 CMake,选 CPU 版加 MKL,然后并行编译,产物是 build 目录下的 ppocr。
PADDLE_LIB 或 OPENCV_DIR 少传一个,CMake 直接 FATAL_ERROR 停下。这是好事,菜谱明确告诉你缺什么,而不是编译到一半才炸。
还有一个容易忽略的点:configure 阶段会自动从官方镜像下载 abseil-cpp、clipper、nlohmann 三个第三方包并解压到 third_party 下。所以跑 cmake 的机器必须能上网;内网环境要提前把这三个 tgz 手动放进对应目录。
4个CMake开关,分别怎么拨
菜谱前十几行就是全部开关:WITH_MKL、WITH_GPU、WITH_STATIC_LIB、USE_FREETYPE,没有第 5 个。
- WITH_MKL,默认 ON。走 MKL;拨 OFF 后菜谱自动改链 OpenBLAS 静态库。ARM 上通常拨 OFF。
- WITH_GPU,默认 OFF。拨 ON 需要额外给 CUDA_LIB,Linux 上还要 CUDNN_LIB,然后链接 cudart 和 cudnn。
- WITH_STATIC_LIB,默认 ON。静态链推理库,产物胖但部署省心;拨 OFF 用动态库,产物小、运行时要带齐 .so。
- USE_FREETYPE,默认 OFF。拨 ON 要求你的 OpenCV 带 freetype 模块,否则直接 FATAL_ERROR 拦下你。
Windows 分支还藏了个自动动作:构建后把 mklml.dll、libiomp5md.dll、mkldnn.dll 拷到 build 目录。部署时连它们一起打包带走,别漏。
跨ARM和Windows平台,你会踩的3个坑
同一份菜谱,换个灶台味道就不一样。非 x86-Linux 平台的坑,基本集中在"工具链指哪"和"运行库带哪"两件事上。
ARM交叉编译的sysroot怎么指
PaddleOCR ARM 编译没有现成的工具链文件,得自己写。关键是让 CMake 知道"编译器给 ARM 干活,头文件和库都在 sysroot 里找":
set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_SYSROOT /opt/aarch64/sysroot) set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) set(CMAKE【免费下载链接】PaddleOCR飞桨多语言OCR工具包(实用超轻量OCR系统,支持80+种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部署) Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考