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