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