protof生成c++头文件,并用vs2022进行编译测试

proto文件内容如下:

syntax = "proto3";
message Person
{
	int64 id = 1;
	bytes name = 2;
	string sex = 3;
	int64 age = 4;
}

使用cmake生成的protoc.exe对proto文件进行编译,我的proto文件名称为:Person.proto

使用命令:

protoc .\Person.proto --cpp_out=./

生成的Person.pb.h以及Person.pb.cc文件路径与proto文件路径一致,在vs2022中创建空项目

将上面两个文件添加进项目中,修改项目属性,将cmake生成的头文件以及库添加,我是放在D盘中

 然后修改c/c++下,预处理器,在预处理器定义中添加 PROTOBUF_USE_DLLS,如果这个地方没有添加,会在后序编译中报错

在编译过程中会出现“无法解析的外部命令”的错误,是因为缺少相关的依赖项,在属性-输入-附加依赖项中添加  libprotobufd.lib  即可

 

在Person.pb.h中会有一些地方报错,基本是宏定义错误,可以在头文件中添加如下内容:

#define PROTOBUF_NAMESPACE_OPEN \
  namespace google              \
  {                             \
    namespace protobuf          \
    {
#define PROTOBUF_NAMESPACE_CLOSE \
  }                              \
  }
#define PROTOBUF_NAMESPACE_ID google::protobuf
#define PROTOBUF_CONSTEXPR
#define PROTOBUF_ATTRIBUTE_REINITIALIZES
#define PROTOBUF_NODISCARD [[nodiscard]]
#define PROTOBUF_ALWAYS_INLINE
using namespace google;

然后编写测试代码,进行序列化以及反序列化,如下:

#include <iostream>
#include "Person.pb.h"
using namespace std;


/*
	 message Person
	{
		int64 id = 1;
		string name = 2;
		string sex = 3;
		int64 age = 4;
	}	
*/
int main()
{
	//1.创建person对象,并且初始化
	Person p;
	p.set_id(1001);
	p.set_name("路飞");
	p.set_sex("man");
	p.set_age(18);
	//2.将person对象序列化  --  字符串
	string output;
	p.SerializeToString(&output);
	cout << "序列化后的数据是:" << output << endl;
	//3.数据传输
	// 
	//4.接收数据,解析(output) --解码
	//4.1创建对象
	Person p1;
	//4.2解析
	p1.ParseFromString(output);
	//5.处理原始数据  -- 打印数据信息
	cout << "id = " << p1.id() << endl;
	cout << "name = " << p1.name() << endl;
	cout << "sex = " << p1.sex() << endl;
	cout << "age = " << p1.age() << endl;
	
	system("pause");
	return 0;
}

最后运行效果如下:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值