-
Notifications
You must be signed in to change notification settings - Fork 4.2k
FAQ ncnn protobuf problem.zh
wiki-sync-bot edited this page Nov 22, 2024
·
1 revision
protobuf 有关的报错,一般都是两个原因:
- 需要的 pb 没安装/
FindProtobuf.cmake
不存在,最终find_package
失败 - 系统不止一套 pb,导致 bin/lib/include 三者不匹配
如果你遇到了这些报错,都可以通过本文档解决:
- Linux 编译
caffe2ncnn
时报Protobuf not found
- 编译
caffe2ncnn
时报 protoc 和 protobuf.so 版本不匹配
这个办法包治百病,不管什么情况一定生效
- 编译下载 protobuf,以 3.20.0 版本为例
$ 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 就更乱了。
- 修改 cmake
找到报错的 CMakeLists.txt,在 find_package
前插入 protobuf 路径。
# 加入下面 1 行
list(APPEND CMAKE_PREFIX_PATH "/path/to/install")
find_package(Protobuf REQUIRED)
...
- 调整 cmake 选项
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 未安装或环境变量未设置
- 安装 protobuf
Ubuntu 系统尝试以下命令
$ sudo apt-get install libprotobuf-dev protobuf-compiler
CentOS 尝试
$ sudo yum install protobuf-devel.x86_64 protobuf-compiler.x86_64
- 然后设置 C++ 环境
在 LD_LIBRARY_PATH 增加参数
$ export LD_LIBRARY_PATH=${YOUR_PROTOBUF_LIB_PATH}:$LD_LIBRARY_PATH
- 先看 protoc 需要的 so 版本号
$ ldd `whereis protoc| awk '{print $2}'` | grep libprotobuf.so
例如是 libprotobuf.so.10
- 然后搜这个文件所在的路径
$ cd / && find . -type f | grep libprotobuf.so.10
假设在/home/user/mydir
- 设置 protobuf.so 的搜索目录
$ export LD_LIBRARY_PATH=/home/user/mydir:$LD_LIBRARY_PATH
关于环境变量设置、工具和技巧,强烈建议学习下 https://missing.csail.mit.edu/