BZ易风

导航

 

配置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

posted on 2021-09-13 16:37  BZ易风  阅读(414)  评论(0编辑  收藏  举报