我的C/C++语言学习进阶之旅什么是.pb.h 和 .pb.cc 文件?
Posted 字节卷动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的C/C++语言学习进阶之旅什么是.pb.h 和 .pb.cc 文件?相关的知识,希望对你有一定的参考价值。
一、问题来源
为什么会提问: 什么是.pb.h 和 .pb.cc 文件?
因为我最近在看Mediapipe的源码时,在部分.cc
文件中有很多头文件的名字是类似 XXX.pb.h
的,
这引起了我的好奇心:这些 XXX.pb.h
到底是什么?
二、探索问题
有问题就要去寻找答案。最终我通过下面的几个链接的内容,大致了解了问题的答案。读者也可以查阅这几篇文章看看。
- https://github.com/protocolbuffers/protobuf
- https://github.com/IvanSafonov/grpc-cmake-example
- https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#invocation
- https://en.wikipedia.org/wiki/Protocol_Buffers
- Protocol Buffers In C++
- c++使用protobuf文件生成pb.h和pb.cc
- 【ProtoBuf】ProtoBuf 通过 proto 文件生成 cc/h 文件
三、总结
3.1 什么是Protocol Buffer
3.1.1 Protocol Buffer简介
Protocol Buffers (Protobuf)
是一种免费的开源跨平台数据格式,用于序列化结构化数据
。
它在开发程序以通过网络相互通信或存储数据时很有用。
该方法涉及描述某些数据结构的接口描述语言和从该描述生成源代码以生成或解析表示结构化数据的字节流的程序。
Protocol Buffers (Protobuf)
是 Google
的语言中立、平台中立、可扩展的结构化数据序列化机制——类似XML,但更小、更快、更简单。您只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地将结构化数据写入和读取各种数据流,并使用各种语言。
3.1.2 Protocol Buffers (Protobuf)
如何定义
Protocol Buffers (Protobuf)
由文件.proto
文本文件定义,我们可以轻松地阅读并理解。
3.1.3 更多阅读
更多关于Protocol Buffers (Protobuf)
的资料可以参考:
3.2 什么是.pb.h 和 .pb.cc 文件?
结论:其实
.pb.h
和.pb.cc
文件就是protoc
编译器根据.proto
文件,编译生成对应的头文件
和实现文件
。
更多关于.proto文件如何生成.pb.h 和 .pb.cc 文件的可以参考下面的链接:
- https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#invocation
- Protocol Buffers In C++
- c++使用protobuf文件生成pb.h和pb.cc
- 【ProtoBuf】ProtoBuf 通过 proto 文件生成 cc/h 文件
protoc
编译器为每个 .proto
文件输入创建一个头文件
和一个实现文件
。输出文件的名称是通过获取 .proto 文件的名称并进行两项更改来计算的:
- 对于
头文件
或实现文件
,扩展名 (.proto
) 分别替换为.pb.h
或.pb.cc
。 proto
路径(由--proto_path
= 或 -I 命令行标志指定)被替换为输出路径(由--cpp_ou
t= 标志指定)。
因此,例如,假设您按如下方式调用编译器:
protoc --proto_path=src --cpp_out=build/gen src/foo.proto src/bar/baz.proto
编译器将读取文件 src/foo.proto
和 src/bar/baz.proto
并生成四个输出文件:
- build/gen/foo.pb.h
- build/gen/foo.pb.cc
- build/gen/bar /baz.pb.h
- build/gen/bar/baz.pb.cc
如果需要,编译器会自动创建目录 build/gen/bar
,但不会创建 build
或 build/gen
;它们必须已经存在
。
3.3 一个示例
定义一个 polyline.proto
,如下所示:
//polyline.proto
syntax = "proto2";
message Point
required int32 x = 1;
required int32 y = 2;
optional string label = 3;
message Line
required Point start = 1;
required Point end = 2;
optional string label = 3;
message Polyline
repeated Point point = 1;
optional string label = 2;
Point
消息定义了两个强制性数据项,x
和 y
。label
是可选的。每个数据项都有一个tag
。tag
在等号之后定义。例如,x
具有的tag
是 1
。
Line
和Polyline
消息都使用了Point
消息,演示了组合在 Protocol Buffers
中的工作方式。Polyline
有一个repeated
的字段,其行为类似于vector
。
随后可以编译此模式以供一种或多种编程语言使用。 Google
提供了一个名为 protoc
的编译器,它可以为 C++、Java 或 Python
生成输出。其他模式编译器可从其他来源获得,用于为 20 多种其他语言创建与语言相关的输出。
例如,在生成上述协议缓冲区模式的 C++
版本后,C++
源代码文件 polyline.cpp
可以使用如下消息对象:
polyline.cpp
文件如下所示:
// polyline.cpp
#include "polyline.pb.h" // generated by calling "protoc polyline.proto"
Line* createNewLine(const std::string& name)
// create a line from (10, 20) to (30, 40)
Line* line = new Line;
line->mutable_start()->set_x(10);
line->mutable_start()->set_y(20);
line->mutable_end()->set_x(30);
line->mutable_end()->set_y(40);
line->set_label(name);
return line;
Polyline* createNewPolyline()
// create a polyline with points at (10,10) and (20,20)
Polyline* polyline = new Polyline;
Point* point1 = polyline->add_point();
point1->set_x(10);
point1->set_y(10);
Point* point2 = polyline->add_point();
point2->set_x(20);
point2->set_y(20);
return polyline;
以上是关于我的C/C++语言学习进阶之旅什么是.pb.h 和 .pb.cc 文件?的主要内容,如果未能解决你的问题,请参考以下文章