一、配置过程
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" 是两种常见的构建配置或构建模式,它们之间有一些区别。
-
Debug 模式:
- Debug 模式旨在帮助开发人员进行调试和测试。
- 在 Debug 模式下,编译器会生成包含调试信息的二进制文件,这些信息可以用于调试器在运行时跟踪程序的执行。
- Debug 模式通常会禁用某些优化,以便在调试过程中更容易观察和分析代码的执行过程。
- Debug 模式可能会包含额外的运行时检查和错误检测机制,以帮助发现和修复潜在的问题。
-
Release 模式:
- Release 模式旨在生成用于最终部署或发布的优化代码。
- 在 Release 模式下,编译器会对代码进行更多的优化,以提高执行效率和减小生成的二进制文件的大小。
- Release 模式通常会禁用或减少调试信息的生成,以减小可执行文件的大小。
- Release 模式更注重性能和效率,而不是为了方便调试和开发。
综上所述,Debug 模式适用于开发和调试阶段,它提供了更多的调试信息和辅助工具,但可能会牺牲一些性能。而 Release 模式适用于最终部署或发布阶段,它会进行更多的优化以提高性能,同时减少了调试信息的生成。
在实际开发中,通常会根据需要在 Debug 模式和 Release 模式之间进行切换。在开发和测试阶段使用 Debug 模式,以便更方便地调试和分析代码。而在发布或部署阶段,使用 Release 模式以获得更好的性能和较小的文件大小。
请注意,不同的开发环境和编程语言可能会有不同的方式来配置和使用 Debug 和 Release 模式。具体的配置方式和设置取决于你使用的开发工具和平台。
六、报错的解决办法
vs2022使用protobuf报错总结_编程小老弟的博客-CSDN博客
后续
遇到了报错一直解决不掉,先暂停吧。。。唉