出于某种原因,我需要在某平台上打包编译paddleocr的组件,中间踩了很多坑。
简单在这里总结一下吧。有其他问题可以留言。
文章末尾我给出已经编译好的文件,有需要自取。

环境不用多说,CMake和Git必备。GCC建议自备10+,官方推荐8和5,看个人,不使用官方推荐的版本,还是建议全自己编译一下。

编译openCV

首先编译openCV,openCV似乎3和4都可以(不作确定与保证),在官方的readme里面写得很清楚,openCV毕竟是大项目,基本上不会出现问题。
我用的是官方推荐的3.4.7,似乎4.5.5也能在paddle中使用。
编译sh如下。

# 建议使用绝对路径
root_path="/xxxxxxx/deployCpp/opencv-3.4.7"
install_path=${root_path}/opencv3
build_dir=${root_path}/build

rm -rf ${build_dir}
mkdir ${build_dir}
cd ${build_dir}

cmake .. \
    -DCMAKE_INSTALL_PREFIX=${install_path} \
    -DCMAKE_BUILD_TYPE=Release \
    -DBUILD_SHARED_LIBS=OFF \
    -DWITH_IPP=OFF \
    -DBUILD_IPP_IW=OFF \
    -DWITH_LAPACK=OFF \
    -DWITH_EIGEN=OFF \
    -DCMAKE_INSTALL_LIBDIR=lib64 \
    -DWITH_ZLIB=ON \
    -DBUILD_ZLIB=ON \
    -DWITH_JPEG=ON \
    -DBUILD_JPEG=ON \
    -DWITH_PNG=ON \
    -DBUILD_PNG=ON \
    -DWITH_TIFF=ON \
    -DBUILD_TIFF=ON

make -jxx
make install

接下来没什么好说的,等着滚动条滚动就行,openCV毕竟是国际大项目,没啥问题。

编译完成后得到build文件,Linux系统接下来的OPENCV_DIR变量指向这个文件夹就行了,Windows参考VS版本,一般为指向build文件夹下的VC15文件夹。

编译paddlepaddle

clone paddlepaddle仓库,建议直接最新版本梭哈。
先说说Linux下的编译,在deploy/cpp_infer/tools内有编译脚本,我没用CUDA和CUDNN,纯CPU MKL部署。我是在英特尔CPU下部署的,据说openBLAS对AMD友好,就这样。
官方的预编译仓库地址:https://paddleinference.paddlepaddle.org.cn/user_guides/download_lib.html#linux
官方的手册:https://paddleinference.paddlepaddle.org.cn/user_guides/source_compile.html
吐槽一下,现在越来越喜欢docker了,编译怎么也用docker。

sudo apt-get install gcc g++ make cmake git vim unrar python3 python3-dev python3-pip swig wget patchelf libopencv-dev
pip3 install numpy protobuf wheel setuptools

rm -rf build
mkdir build
cd build

# 注意需要修改ulimit -n nofile属性
# 在高版本ubuntu不起作用,需要手动修改/etc/systemd/system.conf
# /etc/systemd/user.conf,添加 DefaultLimitNOFILE=65535
# 在 /etc/security/limits.conf 添加以下两行
# hard nofile 65535
# soft nofile 65535
ulimit -n 4096

cmake  .. \
    -DWITH_CONTRIB=OFF \
    -DWITH_MKL=ON \
    -DWITH_MKLDNN=ON  \
    -DWITH_TESTING=OFF \
    -DCMAKE_BUILD_TYPE=Release \
    -DWITH_INFERENCE_API_TEST=OFF \
    -DON_INFER=ON \
    -DWITH_PYTHON=ON

# 可在此手动修改,针对高版本GCC
# 在thr_party/protobuf 中的报错,将函数修改为const类型
# paddle自己的报错,取消迭代器为const的限制
# 再手动make clean
# make -jx 即可

make -j48
make inference_lib_dist

等等,先别着急跑,有坑,paddle亲自给你挖的。
paddle里面所有的编译优化参数-O (IO戏称氧气)全部写成了小写-o3,-o其实是重命名的代码,于是乎会导致Cmake找不到。

nano CMakeList.txt 

把所有的-o3都改成-O3,就没问题了。

paddle本体编译一般不会出现什么问题,Windows有官方的预编译包,直接下就好了,别折腾了。如果要折腾也一样,Windows有好用的CMake GUI,参数一填,也一样。Windows建议使用VS编译。

编译paddleOCR cpp_infer

OK,现在我们有paddle本体和openCV了,开始编译paddleOCR里面的cpp_infer吧。
主要讲讲Linux,Windows有非常详细的官方教程,都别忘了改CMakeList.txt里面的-o3。
Windows 参考链接:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/deploy/cpp_infer/docs/windows_vs2019_build.md
Windows 没啥坑可以踩,别忘了拷贝DLL哦。

Linux编译脚本如下

OPENCV_DIR="/xxxx/deployCpp/opencv-3.4.7/opencv3"
LIB_DIR="/xxxx/deployCpp/paddlepaddle/Paddle/build"
paddle_inference_install_dir
CUDA_LIB_DIR=your_cuda_lib_dir
CUDNN_LIB_DIR=your_cudnn_lib_dir

BUILD_DIR=build
rm -rf ${BUILD_DIR}
mkdir ${BUILD_DIR}
cd ${BUILD_DIR}
cmake .. \
    -DPADDLE_LIB=${LIB_DIR} \
    -DWITH_MKL=ON \
    -DWITH_GPU=OFF \
    -DWITH_STATIC_LIB=OFF \
    -DWITH_TENSORRT=OFF \
    -DOPENCV_DIR=${OPENCV_DIR} \
    -DCUDNN_LIB=${CUDNN_LIB_DIR} \
    -DCUDA_LIB=${CUDA_LIB_DIR} \
    -DTENSORRT_DIR=${TENSORRT_DIR} \

make -jxx

到此,编译结束了。可以看到build文件夹内生成的ppocr文件。Windows拷贝DLL就可以运行,Linux似乎包含了所有内容(仅限于完全自己编译),使用官方预编译似乎不行,需要手动拷贝一些.so文件。

文件下载列表:
(懒得加,有时间先)

洗出结果的正则:(适合摆烂用,到时候一起补全)