美文网首页
protobuf安装和嵌套定义

protobuf安装和嵌套定义

作者: 码哥说 | 来源:发表于2019-03-21 15:30 被阅读0次

    背景

    博主因为公司项目原因,客户端和服务端通信采用了protobuf协议,关于protobuf协议,不明白的自行百度,这个协议因其高效安全性,还是蛮常见的。
    博主也是第一次安装使用,定义协议文件时发现不知道如何嵌套定义结构了,摸索。

    安装

    建议直接参考git上的README

    1. 下载https://github.com/google/protobuf,解压
    2. 需要以下依赖工具autoconf automake libtool curl make g++ unzip
    3. 进入根目录./autogen.sh
    4. 安装时出现
         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
    
    1. ./configure (更改安装路径的方式:--prefix=/usr/local/protobuf)
    2. make、make check、make install
    1. 配置
    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值

    两种方式

    1. mutable_centerpoint():
    demo::Point *p; 
    demo::Draw draw;
    p = draw.mutable_centerpoint(); //返回指针
    p->set_posx(22);
    printf("%f\n", draw.centerpoint().posx());
    
    1. 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());
    

    相关文章

      网友评论

          本文标题:protobuf安装和嵌套定义

          本文链接:https://www.haomeiwen.com/subject/eagfmqtx.html