protobuf配置过程

news2024/11/19 10:28:00

一、配置过程

vs2022 第一次下载cmake 3.17 x64.msi , 发现没有vs2022选项。

第二次下载最新版本cmake 3.27 x64.msi , 发现不兼容vs2022 , 会闪退;

第三次下载了倒数第二新的版本cmake 3.26 x64.msi , 这次完美generate

二、protobuf

三、UML类图

1、根据类图开发

2、笔试 - 根据代码画出类图

四、语法

person.proto

syntax = "proto3";
message person
{
	int32 sid = 1;	//编号从1开始
	string name = 2;	//有中文用bytes,没中文用string就够
	string sex = 3;
	int32 age = 4;
}

生成了两个文件:
person.pb.cc
person.pb.h

在 person.proto 文件中,我们使用了 Protocol Buffers 的版本 proto3。在这个文件中定义了一个名为 person 的消息类型。

person 消息类型包含以下字段:

  • sid 是一个整数类型的字段,字段标签为 1,用于表示编号,编号从1开始。
  • name 是一个字符串类型的字段,字段标签为 2,用于表示姓名。
  • sex 是一个字符串类型的字段,字段标签为 3,用于表示性别。
  • age 是一个整数类型的字段,字段标签为 4,用于表示年龄。

根据这个 person.proto 文件,通过使用 Protocol Buffers 的编译器 protoc,我们生成了两个文件:person.pb.cc 和 person.pb.h

这两个文件是根据 person.proto 中定义的消息类型自动生成的,这两个文件里的内容是:用于序列化和反序列化 person 消息的代码。通过使用这些生成的文件,我们可以在应用程序中使用 person 消息类型进行数据的打包和解包。

指定头文件

 

无法解析的外部命令、无法定义的引用 ------>  只有头文件,却缺少动态库

 

protobuf数组

 
    /*
    * 在proto文件中  加repeated变为数组
    * 数组:申请一块内存,存储名字
    * p.add_name();
    * p.set_name(0,"小豪");
    * 
    * p.add_name();
    * p.set_name(1,"小王");
    * 
    * p.add_name();
    * p.set_name(2,"小吴");   其他sex、age等不变 ,
    打印的时候:p2.name(0) p2.name(1) p2.name(2)
    */

 

protobuf枚举 

syntax = "proto3";
// 定义枚举
enum Color
{
	Red = 0;	// protbuf中,第一个枚举值必须为0
	Green = 6;
	Blue = 9;
}
message Persion
{
    int32 id = 1;   // 编号从1开始
    bytes name = 2;
    string sex = 3;
    int32 age = 4;
    Color color = 5;	// 定义枚举变量
}


//测试:重新生成.h,.cc  、 替换  、运行测试
p.set_color(Blue);
cout << ",color:" << p2.color();   //,color:9

 message中可以嵌套message

message Persion
{
    int32 id = 1;   // 编号从1开始
    bytes name = 2;
    string sex = 3;
    int32 age = 4;
    Color color = 5;	// 定义枚举变量
}

message Persion1
{
    int32 id = 1;   // 编号从1开始
    bytes name = 2;
    string sex = 3;
    int32 age = 4;
    Color color = 5;	// 定义枚举变量
    Person p = 6;
}

 proto导入文件

// Persion.proto
syntax = "proto3";
// 导入另外一个proto文件
import "Info.proto";

enum Color
{
	Red = 0;	// protbuf中第一个枚举值必须为0
	Green = 6;
	Blue = 9;
}

message Persion
{
    int32 id = 1;   // 编号从1开始
    repeated bytes name = 2;
    string sex = 3;
    int32 age = 4;
    Color color = 5;
    Info info = 6;	// Info对象, 导入的proto文件中的类
}
// Info.proto
syntax = "proto3";

message Info
{
    bytes address = 1;  // 地址
    int32 number = 2;   // 门牌号
}

        

D:\BaiduNetdiskDownload\linux黑马32期资料\钻石课程\第5阶段-跨平台企业项目实战\day03 - 序列化-protobuf使用\01-教学资料>protoc ./person.proto --cpp_out=./

D:\BaiduNetdiskDownload\linux黑马32期资料\钻石课程\第5阶段-跨平台企业项目实战\day03 - 序列化-protobuf使用\01-教学资料>protoc ./Info.proto --cpp_out=./

 c++


	p.set_color(Blue);
	Info* info = p.mutable_info();
	info->set_address("北京昌平区tdb大厦");
	info->set_id(911);

	Info li = pp.info();

	cout << ",address:" << li.address()
		<< ",number:" << li.number() << endl;

包 (即c++中的命名空间)

命名空间  解决的是 两个不同文件同名类的问题(两个人分别写了一个文件,但是都文件中的message变量名相同。)
 


```protobuf
// Persion.proto
syntax = "proto3";
// 导入另外一个proto文件
import "Info.proto";
// 添加命名空间
package itcast;	// Persion类属于itcast这个命名空间

enum Color
{
	Red = 0;	// protbuf中第一个枚举值必须为0
	Green = 6;
	Blue = 9;
}

message Persion
{
    int32 id = 1;   // 编号从1开始
    repeated bytes name = 2;
    string sex = 3;
    int32 age = 4;
    Color color = 5;
    // 命名空间.类名
    itheima.Info info = 6;	// Info对象, 导入的proto文件中的类
}
```

```protobuf
// Info.proto
syntax = "proto3";
// Persion类属于itheima这个命名空间
package itheima;

message Persion
{
    bytes address = 1;  // 地址
    int32 number = 2;   // 门牌号
}
```

五、debug和realease的区别

release打断点,程序不会停

release是发布版本时,才用到。

在软件开发中,"Debug" 和 "Release" 是两种常见的构建配置或构建模式,它们之间有一些区别。

  1. Debug 模式:

    • Debug 模式旨在帮助开发人员进行调试和测试。
    • 在 Debug 模式下,编译器会生成包含调试信息的二进制文件,这些信息可以用于调试器在运行时跟踪程序的执行。
    • Debug 模式通常会禁用某些优化,以便在调试过程中更容易观察和分析代码的执行过程。
    • Debug 模式可能会包含额外的运行时检查和错误检测机制,以帮助发现和修复潜在的问题。
  2. Release 模式:

    • Release 模式旨在生成用于最终部署或发布的优化代码。
    • 在 Release 模式下,编译器会对代码进行更多的优化,以提高执行效率和减小生成的二进制文件的大小。
    • Release 模式通常会禁用或减少调试信息的生成,以减小可执行文件的大小。
    • Release 模式更注重性能和效率,而不是为了方便调试和开发。

综上所述,Debug 模式适用于开发和调试阶段,它提供了更多的调试信息和辅助工具,但可能会牺牲一些性能。而 Release 模式适用于最终部署或发布阶段,它会进行更多的优化以提高性能,同时减少了调试信息的生成。

在实际开发中,通常会根据需要在 Debug 模式和 Release 模式之间进行切换。在开发和测试阶段使用 Debug 模式,以便更方便地调试和分析代码。而在发布或部署阶段,使用 Release 模式以获得更好的性能和较小的文件大小。

请注意,不同的开发环境和编程语言可能会有不同的方式来配置和使用 Debug 和 Release 模式。具体的配置方式和设置取决于你使用的开发工具和平台。

六、报错的解决办法

vs2022使用protobuf报错总结_编程小老弟的博客-CSDN博客

后续

遇到了报错一直解决不掉,先暂停吧。。。唉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/813307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简单认识redis高可用实现方法

文章目录 一、redis群集三种模式二、 Redis 主从复制1、简介2、作用&#xff1a;3、流程&#xff1a;4.配置主从复制 三、Redis 哨兵模式1、简介2、原理:3、作用&#xff1a;4、哨兵结构由两部分组成&#xff0c;哨兵节点和数据节点&#xff1a;5、故障转移机制&#xff1a;6、…

C/C++ 线程池工作原理 C代码实现

1. 线程池作用 如果多次使用线程&#xff0c;那么就需要多次的创建并撤销线程。但是创建/撤销的过程会消耗资源。线程池是一种数据结构&#xff0c;其中维护着多个线程&#xff0c;这避免了在处理短时间任务时&#xff0c;创建与销毁线程的代价。即在程序开始运行前预先创建一…

day15 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

文章目录 一、平衡二叉树二、[回溯小难]二叉树的所有路径三、左叶子之和 一、平衡二叉树 110.平衡二叉树 依旧是使用后序遍历来统计高度。 递归过程中&#xff0c;发现某节点的左右子树的高度差超过了1&#xff0c;我们就直接返回-1&#xff0c;不返回节点的高度了。 递归函…

C/C++开发,opencv与qt结合播放视频

目录 一、qt_ui创建 1.1 ui设置 1.2 ui及代码输出保存 二、创建工程 2.1 工程目录及编译设置 2.2 源码设计 三、编译及测试 3.1 程序编译 3.2 程序运行 首先声明&#xff0c;这是一个OpenCV 3学习文档的案例&#xff0c;但是说明有些过于省略&#xff0c;只有一些简短的代码…

ubuntu20.04终端中文显示乱码

我在配置好ubuntu20.04虚拟机以后&#xff0c;用xshell连接到终端&#xff0c;发现中文来不能显示&#xff0c;尝试过设置xshell的显示格式&#xff0c;不能解决问题。 经过研究&#xff0c;发现要修改ubuntu20.04本身的字体格式&#xff0c;解决方式如下&#xff1a; 1.修改~…

JavaBean

一、JavaBean的概念 1、JavaBean就是MVC设计模式中的model层 2、种类&#xff1a;数据bean&#xff08;pojo&#xff09;&#xff0c;逻辑bean 数据bean分为&#xff1a; 表单bean 封装表单里的参数&#xff0c;属性名字、个数和类型要和表单的参数的名字、个数和类型一致…

我对排序算法理解

排序算法一直是一个很困惑我的问题&#xff0c;早在刚开始接触 数据结构的时候&#xff0c;这个地方就很让我不解。就是那种&#xff0c;总是感觉少了些什么的感觉。一开始&#xff0c;重新来过&#xff0c;认真来学习这一部分&#xff0c;也总是学着学着就把概念记住了。过了一…

【Rust学习 | 基础系列3 | Hello, Rust】编写并运行第一个Rust程序

文章目录 前言一&#xff0c;创建项目二&#xff0c;两种编译方式1. 使用rustc编译器编译2. 使用Cargo编译 总结 前言 在开始学习任何一门新的编程语言时&#xff0c;都会从编写一个简单的 “Hello, World!” 程序开始。在这一章节中&#xff0c;将会介绍如何在Rust中编写并运…

Elasticsearch搜索引擎系统入门

目录 【认识Elasticsearch】 Elasticsearch主要应用场景 Elasticsearch的版本与升级 【Elastic Stack全家桶】 Logstash Kibana Beats Elasticsearch在日志场景的应用 Elasticsearch与数据库的集成 【安装Elasticsearch】 安装插件 安装Kibana 安装Logstash 【认…

Day01-作业(HTMLCSS)

作业1&#xff1a;通过HTML的标签及CSS样式&#xff0c;完成如下企业简介html页面的制作。 【必做】 A. 最终效果如下&#xff1a; B. 文字素材如下&#xff1a; 企业简介传智教育(股票代码 003032)&#xff0c;隶属江苏传智播客教育科技股份有限公司&#xff0c;注册资本4亿元…

【NVIDIA CUDA】2023 CUDA夏令营编程模型(一)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

【Git】Git GitHub

1. Git1.1 Git基本操作1.2 Git版本回退1.3 Git分支操作 2. Git 配合GitHub2.1 生成密钥2.2 GitHub添加公钥2.3 Git连接GitHub2.4 本地仓库关联远程仓库2.5 本地代码push远程仓库2.6 本地clone远程仓库2.7 本地fetch和pull 1. Git 1.1 Git基本操作 touch test.py 工作区创建文…

全网最细,Postman接口测试实战详细总结,一篇进阶...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Postman是一款功能…

【力扣每日一题】2023.7.30 环形链表2

题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这道题属于是那种知道解法就很简单&#xff0c;不知道解法就很难独立想出来的那种&#xff0c;我们只需要稍微记住这类题的固定解法就可以。 所以接下来我先说解法&#xff0c;再解释为什么解法可以解出来。 那么我们都…

nginx使用-(想学nginx,这篇就够了)

nginx使用-&#xff08;想学nginx&#xff0c;这篇就够了&#xff09; upstream wgz{server 127.0.0.1:8081 ;server 127.0.0.1:8082 ;fair;}反向代理 动静分离 负载均衡 高可用集群配置 反向代理 upstream要转发的地址的配置proxy_pass请求转发的地址 location /user{proxy_…

程序设计 算法基础

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【并发专题】操作系统模型及三级缓存架构

目录 课程内容一、冯诺依曼计算机模型详解1.计算机五大核心组成部分2.CPU内部结构3.CPU缓存结构4.CPU读取存储器数据过程5.CPU为何要有高速缓存 学习总结 课程内容 一、冯诺依曼计算机模型详解 现代计算机模型是基于-冯诺依曼计算机模型 计算机在运行时&#xff0c;先从内存中…

python学习之【浅拷贝】

前言 上一篇文章&#xff0c;python学习之【继承、封装、多态】主要学习了面向对象的三大特征。这篇文章记录下对python的浅拷贝的学习&#xff0c;下一篇文章接着学习深拷贝。 简单了解 浅拷贝&#xff1a;python拷贝一般都是浅拷贝&#xff0c;拷贝时&#xff0c;对象包含的…

【C语言】函数重难点之函数递归

大家好&#xff0c;我是深鱼~ 目录 一、函数递归知识讲解 1.什么是递归&#xff1f; 2.递归的两个必要条件 2.1练习1&#xff1a; 2.2练习2&#xff1a; 二、递归与迭代 2.1练习3 2.2练习4 一、函数递归知识讲解 1.什么是递归&#xff1f; 程序调用自身的编程技巧称为…

UNITY随记(八) SHADER实现立方体CUBE显示边框,描边

Shader "Vitens/CubeOutline"{Properties{_Color("Color", color) = (1,1,1,1)_Width("Width", range(0,0.5)) = 0.1}SubShader{Tags {"Queue"=