docs/how-to-use-and-FAQ/FAQ-ncnn-protobuf-problem.zh.md
protobuf 有关的报错,一般都是两个原因:
FindProtobuf.cmake不存在,最终 find_package 失败如果你遇到了这些报错,都可以通过本文档解决:
caffe2ncnn 时报 Protobuf not foundcaffe2ncnn 时报 protoc 和 protobuf.so 版本不匹配这个办法包治百病,不管什么情况一定生效
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.20.0/protobuf-cpp-3.20.0.tar.gz
$ tar xvf protobuf-cpp-3.20.0.tar.gz
$ cd protobuf-3.20.0/
$ ./configure --prefix=/path/to/install
$ make && make install
注意需要 --prefix,不要装到系统里。能遇到这些错,说明本来系统环境就有问题,再给系统环境装 lib 就更乱了。
找到报错的 CMakeLists.txt,在 find_package 前插入 protobuf 路径。
# 加入下面 1 行
list(APPEND CMAKE_PREFIX_PATH "/path/to/install")
find_package(Protobuf REQUIRED)
...
cmake .. 时,额外加入选项 -DProtobuf_PROTOC_EXECUTABLE=/path/to/install/bin/protoc
$ cd /path/to/ncnn/build
$ rm -rf CMakeCache
# 加入新选项
$ cmake .. -DProtobuf_PROTOC_EXECUTABLE=/path/to/install/bin/protoc
$ ...
Protobuf not found是因为 protobuf 未安装或环境变量未设置
Ubuntu 系统尝试以下命令
$ sudo apt-get install libprotobuf-dev protobuf-compiler
CentOS 尝试
$ sudo yum install protobuf-devel.x86_64 protobuf-compiler.x86_64
在 LD_LIBRARY_PATH 增加参数
$ export LD_LIBRARY_PATH=${YOUR_PROTOBUF_LIB_PATH}:$LD_LIBRARY_PATH
$ ldd `whereis protoc| awk '{print $2}'` | grep libprotobuf.so
例如是 libprotobuf.so.10
$ cd / && find . -type f | grep libprotobuf.so.10
假设在/home/user/mydir
$ export LD_LIBRARY_PATH=/home/user/mydir:$LD_LIBRARY_PATH
关于环境变量设置、工具和技巧,强烈建议学习下 https://missing.csail.mit.edu/