protobuf配置过程

一、配置过程

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

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

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

protobuf配置过程_第1张图片

protobuf配置过程_第2张图片

二、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配置过程_第3张图片

指定头文件

protobuf配置过程_第4张图片

 protobuf配置过程_第5张图片

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

protobuf配置过程_第6张图片

 protobuf配置过程_第7张图片protobuf配置过程_第8张图片

protobuf配置过程_第9张图片

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配置过程_第10张图片

 protobuf配置过程_第11张图片

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=./

protobuf配置过程_第12张图片

 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博客

后续

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

你可能感兴趣的:(linux,运维,服务器)