zoukankan      html  css  js  c++  java
  • Protobuf配置

    配置Protobuf

    1.下载protobuf

    版本3.12.3 试过3.17 不成功 3.5.1 不配套 

    打开cmake说明

    2.下载cmake

    根据README.md文档 配置文件

    如:我起的是

    创建install文件夹

    如:

    3.安装cmake

    安装好后设置环境变量Path中,连同vs的路径

    4.把下载好的protobuf放在创建的环境目录下

    如:

    5.打开cmake图形工具

    设置路径

    生成配置

    不报错就算成功

    6.打开项目

    已经生成

    重要文件

    libprotobuf:项目要使用

    libprotoc:协议代码 在运行编码和解码的时候需要调用protobuf的库 --> runtime (运行时的库)

    protoc:会生成protoc.exe  proto compiler  是proto的编译器-->能够将protobuf协议文件生成多种不同语言的版本,可以点开protoc下的main.cc

    依次生成这三个文件

    使用的时候直接把protobuf这个文件夹塞到项目中去,c的头文件查找-->src->google->protobuf

    创建项目

    配置项目中的proto

    创建一个空项目,然后创建文件夹

    把原来的文件放入proj.win32中

    创建protobuf文件夹放入libprotobuf和libprotoc生成的文件

    把protobuf的包放入到3rd第三方工具文件夹内

    把protoc生成的protoc.exe文件放入proto文件夹

    打开项目

    把头文件改成src,添加proto文件夹, 删除多余的源文件等

    src中创建main.cpp

    #define _CRT_SECURE_NO_WARNINGS
    #include <string.h>
    #include <stdlib.h>
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main(int argc, char** argv)
    {
    
        system("Pause");
        return 0;
    }

    项目右键点击属性

    选择c++添加头文件,第三方工具中生成的头文件

    链接器,添加protobuf的两个lib文件

    添加命令行

    修改成MT/MTD模式: 属性-->配置属性-->C/C++-->代码生成

    配置完成

    Protobuf使用

    1.编写协议文件

    proto文件夹内添加协议文件

    如:person.proto

     //固定格式 message + 协议名称
     message Person {  
      required string name = 1;     //required 必须 
      required int32 age = 2;  
      optional string email = 3;      //optional 可有可无
    }  

    2.protoc编译协议文件,生成对应的语言的编码和解码;

    windows控制端,进入proto文件夹

    protoc.exe -h //查看指令

    如果是c++

    protoc.exe --cpp_out=./ *.proto  //*为文件名 =后面不要有空格 直接跟./

     

    会生成两个文件

     生成代码测试

    #define _CRT_SECURE_NO_WARNINGS
    #include <string.h>
    #include <stdlib.h>
    
    #include <iostream>
    #include <string>
    using namespace std;
    #include "../proto/person.pb.h"
    
    int main(int argc, char** argv)
    {
        //1.定义要传送数据的对象  对应message后跟的名字
        Person p;  
        //2.初始化对象
        p.set_name("大圣");
        p.set_email("wukong@163.com");
        p.set_age(1700);
    
        cout << p.name() << " " << p.age() << " " << p.email() << endl;
        //3.将这个数据对象序列化
        string out;
        p.SerializeToString(&out);
    
        //4.使用string对象里面存放的数据,反序列化数据对象
        Person monkey;
        monkey.ParseFromString(out);
        cout << monkey.name() << " " << monkey.age() << " " << monkey.email() << endl;
        system("Pause");
        return 0;
    }

    protobufc.lib报错

    String field 'Person.name' contains invalid UTF-8 data when serializing a protocol buffer. Use the 'bytes' type if you intend to send raw bytes

    把.proto中定义的string类型改成bytes就好了

    //syntax = "proto3";
    
    //package Person;
    
    message Person {  
      required bytes name = 1;     
      required int32 age = 2;  
      optional bytes email = 3;    
    }  

    结果:

    原文借鉴:https://blog.csdn.net/qq_35813104/article/details/107161414

  • 相关阅读:
    网络通信之 字节序转换原理与网络字节序、大端和小端模式
    [C/C++]大小端字节序转换程序
    面向对象和面向过程的区别
    编译libjpeg
    地形系统lod
    c/c++ 代码中使用sse指令集加速
    个人作品- 蘑菇大战
    个人作品- 几何战争
    Obj格式模型 读取
    各大引擎矩阵的矩阵存储方式 ----行矩阵 or 列矩阵
  • 原文地址:https://www.cnblogs.com/yifengs/p/15263050.html
Copyright © 2011-2022 走看看