git clone https://github.com/PaddlePaddle/PaddleOCR.git
git checkout release/2.4
cd PaddleOCR/deploy/cpp_infer/
二,编译PaddleOCR的推理工具
源码中提供的build.sh是不完整的,需要修改,例如,我的编译指令是在这里,
~/ocr/01/PaddleOCR/deploy/cpp_infer/tools/build.sh
OPENCV_DIR=/home/mc/opencv455/dev/
LIB_DIR=/home/mc/ocr/01/Paddle/build_cuda/paddle_inference_install_dir/
CUDA_LIB_DIR=/usr/local/cuda/lib64
CUDNN_LIB_DIR=/usr/local/cuda/lib64
BUILD_DIR=build
rm -rf ${BUILD_DIR}
mkdir ${BUILD_DIR}
cd ${BUILD_DIR}
cmake .. \
-DPADDLE_LIB=${LIB_DIR} \
-DWITH_MKL=ON \
-DWITH_GPU=ON \
-DWITH_STATIC_LIB=OFF \
-DWITH_TENSORRT=OFF \
# -DOPENCV_DIR=${OPENCV_DIR} \
-DOpenCV_DIR=${OPENCV_DIR} \
-DCUDNN_LIB=${CUDNN_LIB_DIR} \
-DCUDA_LIB=${CUDA_LIB_DIR} \
# -DTENSORRT_DIR=${TENSORRT_DIR} \
make -j
这里有好几个地方需要注意,
- DOPENCV_DIR要换成DOpenCV_DIR,这样才和系统的定义相匹配。
- LIB_DIR是你编译Paddle时的那个目录,大家通常喜欢用build,我这里用的是build_cuda,和官网上的一致,具体可以参考:Ubuntu 20.04 源码编译Paddle2.2.2_高精度计算机视觉的博客-CSDN博客
- Cuda和Cudnn我安装的时候就默认在同一个文件夹里了,可能参考:Ubuntu20.04安装Cuda driver + toolkit + cudnn_高精度计算机视觉的博客-CSDN博客
- 那个make -j 可以根据你的需要修改,比如nproc查出核线程是12,就用make -j12就好了。
然后回到目录(该目录下有一个CMakeLists.txt文件),
/ocr/01/PaddleOCR/deploy/cpp_infer
执行下面的指令,
sudo ./tools/build.sh #执行完此脚本后会在./build文件夹下生成ocr_system可执行文件
这加上sudo权限是因为需要/usr/local下面的写入权限,生成之后你改一下权限就可以变成用户权限了,如下,
sudo chmod -cvR 777 build
三,编译过程中碰到的问题(1)cp: 无法创建普通文件'/usr/lib/libmklml_intel.so': 权限不够
解决办法,
使用sudo权限,这个前面已经解释过了。
(2)没有规则可制作目标
-- Build files have been written to: /home/mc/ocr/01/PaddleOCR/deploy/cpp_infer/build make[2]: *** 没有规则可制作目标“/home/mc/ocr/01/Paddle/build_cuda/paddle/lib/libpaddle_inference.so”,由“ppocr” 需求。 停止。
解决办法,
检查你的路径,通常这个是由路径设置不对,找不到相关的库引起的。
(3)cc1plus: error: too many filenames given
cc1plus: error: too many filenames given. Type cc1plus --help for usage cc1plus: error: too many filenames given. Type cc1plus --help for usage cc1plus: error: too many filenames given. Type cc1plus --help for usage cc1plus: error: too many filenames given. Type cc1plus --help for usage cc1plus: fatal error: CMakeFiles/ppocr.dir/src/postprocess_op.cpp.d: 没有那个文件或目录 cc1plus: fatal error: CMakeFiles/ppocr.dir/src/ocr_rec.cpp.d: 没有那个文件或目录 compilation terminated. compilation terminated. cc1plus: error: too many filenames given. Type cc1plus --help for usage cc1plus: fatal error: CMakeFiles/ppocr.dir/src/main.cpp.d: 没有那个文件或目录 cc1plus: fatal error: CMakeFiles/ppocr.dir/src/ocr_det.cpp.d: 没有那个文件或目录 compilation terminated. compilation terminated. cc1plus: error: too many filenames given. Type cc1plus --help for usage cc1plus: fatal error: CMakeFiles/ppocr.dir/src/ocr_cls.cpp.d: 没有那个文件或目录 compilation terminated. cc1plus: fatal error: CMakeFiles/ppocr.dir/src/utility.cpp.d: 没有那个文件或目录 compilation terminated.
解决办法,
找到
~/ocr/01/PaddleOCR/deploy/cpp_infer/CMakeLists.txt
将 "-o3" 改成 "-O3" 就可以了,修改后的结果如下,
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O3 ${FLAG_OPENMP} -std=c++11")
这应该是一个打字错误引起的,不理解为什么官方没有修正过来。
这个可参考:
c++ - CMake on linux givs error cc1plus: error: too many filenames given - Stack Overflow
go - Import C error in Golang: cc1.exe: error: too many filenames given - Stack Overflow
本文结束