背景
博主因为公司项目原因,客户端和服务端通信采用了protobuf协议,关于protobuf协议,不明白的自行百度,这个协议因其高效安全性,还是蛮常见的。
博主也是第一次安装使用,定义协议文件时发现不知道如何嵌套定义结构了,摸索。
安装
建议直接参考git上的README
- 下载https://github.com/google/protobuf,解压
- 需要以下依赖工具autoconf automake libtool curl make g++ unzip
- 进入根目录./autogen.sh
- 安装时出现
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
autoreconf: /usr/bin/autoconf failed with exit status: 1
原来缺少一个工具libtool,安装:
sudo apt-get install libtool
之后为了保证不出错 ,还需要安装一个工具libsysfs-dev
sudo apt-get install libsysfs-dev
- ./configure (更改安装路径的方式:--prefix=/usr/local/protobuf)
- make、make check、make install
- 配置
export LD_LIBRARY_PATH=/usr/local/lib 否则会出现找不到库文件
protobuf嵌套结构定义
示例协议文件:
demo.proto:
syntax = "proto3";
package demo;
message Point {
float posX = 1;
float posY = 2;
float posZ = 3;
}
message Layer {
bytes name = 1;
}
message Draw {
repeated Layer layers = 1;
Point centerpoint = 2;
}
protoc编译出c++的文件
使用时发现:
对于可重复的Layer可以使用add_layers()赋值,但是centrpoint却没有类似set或add的方式赋值。
打开demo.pb.h搜索一下,发现centrpoint只有两个疑似的函数set_allocated_centerpoint()和mutable_centerpoint(),后续查阅发现,这两个函数都能设置centpoint值
两种方式
- mutable_centerpoint():
demo::Point *p;
demo::Draw draw;
p = draw.mutable_centerpoint(); //返回指针
p->set_posx(22);
printf("%f\n", draw.centerpoint().posx());
- set_allocated_centerpoint():
demo::Draw draw;
demo::Point *p = new gdpdraw::Point;
p->set_posx(22);
draw.set_allocated_centerpoint(p);
printf("%f\n", draw.centerpoint().posx());
网友评论