protobuf 安装使用入门
protobuf 简介
1. protobuf 使用场景
protobuf 是一个跨平台和跨语言的数据结构存储和传输的便利工具。
适用场景举例:
- 比如 C++ 实现了算法,需要用 Python 或者 C# 去调用,并实现在不同语言间用户自定义复杂结构的数据传输。
- 比如用 PyTorch 在 Windows 平台下训练了一个 Python 语言的模型,需要部署到 Linux 系统下面的 C++ 写的软件中。
跨平台,跨语言的数据结构传输是非常困难的,如果使用 XML 等工具,传输的速度和解析速度会受限制,而 protobuf 很好地解决了这一困难。
2. protobuf 官网
GitHub 地址:
https://github.com/protocolbuffers/protobuf
官方文档地址:
https://developers.google.com/protocol-buffers/
Releases 下载地址:
https://github.com/protocolbuffers/protobuf/releases
安装和使用
1. 下载
进入发布版下载地址:
https://github.com/protocolbuffers/protobuf/releases
可以看到有几种下载类型可以选择:
这里如果仅仅使用某种语言可以下载对应的文件,如果补血的,下载 protobuf-all-21.4.zip 也行
另外往下可以看到分平台的文件:
这些是已经 build 好的 Protocol Compiler,可以直接下载了用,也可以自己下载前面源码文件后自己进行 build
这里我们选择下载 protobuf-cpp-3.21.4.zip 作为测试
下载完成后进行解压
2. 安装 CMake
由于这里需要自己进行编译,那么 CMake 是少不了的
CMake 官网:
https://cmake.org/
CMake 下载地址:
https://cmake.org/download/
这里我们选择下载 Windows 下的安装版 cmake-3.24.0-rc4-windows-x86_64.msi
安装完成后,找到 CMake 的安装目录
我的目录是:
F:\Softwares\CMake\bin
以下是该目录下的文件
然后将该路径写入环境变量中的 PATH
右键点击“我的电脑”——》选择“属性”
在“设置”中选择“高级系统设置”
选择“环境变量”
选择“Path”,点击“编辑”
输入 CMake 所在目录,点击“确定”
3. 使用 CMake 进行编译
这里为了演示,采用 CMake 的 UI 模式,确实对于新手来说比较友好
我们先查看下之前下载的 protobuf-cpp-3.21.4.zip 解压后的目录,这里是:
E:\protobuf-cpp-3.21.4\protobuf-3.21.4
目录下的文件列表如下:
在该目录下新建一个 build 文件夹用于存放编译的输出
双击桌面 CMake 图标打开
进入 CMake 界面,输入对应的目录位置
点击 “Configure”,选择 generator 和 platform
这里我们使用 Visual Studio 2019,x64
完成后显示 Configuring done
这里有很多选项,可以参考官方文档每一个的作用,这里先不用修改
点击 Generate
完成后显示 Generating done
进入我们设置的 build 文件夹可以看到编译完成的文件
在 CMake 界面上点击 Open Project,即可在 Visual Studio 中打开编译完成的项目
或者也可以在文件目录中打开 protobuf.sln 进入工程
4. 编译 VS 工程
在解决方案管理器中可以看到如下项目目录
这里在 Debug 模式下进行测试
右键点击“解决方案”——》选择“生成解决方案”
这里生成的时间可能比较长,需要耐心等待~~
其实也可以只选择几个需要的项目进行生成,里面一些 test 其实我们这里是用不到的,但是这里演示方便,直接生成了解决方案
完成后,进入目录:
E:\protobuf-cpp-3.21.4\protobuf-3.21.4\build\Debug
可以看到我们所需的几个文件
5. 定义 .proto 文件
新建一个纯文本文件 myproto.proto
内容如下
syntax = "proto3";
package mypb;
message helloworld
{
optional int32 id = 1;
optional string str = 2;
optional int32 num = 3;
}
这里的 syntax 表示用的是 protobuf 的哪个版本,现在基本都用 3 了
下面的 package 可以理解为类似 namespace
再往下 message 类似 class,所以 helloworld 就好比是类名
这个类下面有 3 个成员变量,分别是 id,str,num
6. 生成 .cc 和 .h 文件
在 Windows 搜索栏搜索 “cmd”
打开“命令提示符”
进入到之前 VS 生成解决方案的目录
E:\protobuf-cpp-3.21.4\protobuf-3.21.4\build\Debug
输入
protoc -I=E:\ --cpp_out=E:\ E:\myproto.proto
然后在目录 E:\ 下出现了我们所需的 .cc 和 .h 文件
7. 创建测试代码
打开 Visual Studio,创建一个新的 C++ 控制台应用
项目的所在目录为
E:\ProtobufTest
目录下的文件为
将 myproto.pb.cc 和 myproto.pb.h 文件拷贝到该目录
然后将文件添加到 VS 的工程内
这里要确认我们构建的是 Debug x64
将 ProtobufTest.cpp 内的代码设置为测试代码:
#include <iostream>
#include <fstream>
#include "myproto.pb.h"
int main(void)
{
//消息封装
mypb::helloworld in_msg;
{
in_msg.set_id(9);
in_msg.set_str("Jack");
std::fstream output("./hello.log", std::ios::out | std::ios::trunc | std::ios::binary);
if (!in_msg.SerializeToOstream(&output)) {
std::cerr << "failed to serialize in_msg" << std::endl;
return -1;
}
}
//消息解析
mypb::helloworld out_msg;
{
std::fstream input("./hello.log", std::ios::in | std::ios::binary);
if (!out_msg.ParseFromIstream(&input)) {
std::cerr << "failed to parse" << std::endl;
return -1;
}
std::cout << out_msg.id() << std::endl;
std::cout << out_msg.str() << std::endl;
}
getchar();
return 0;
}
配置项目属性:
右键点击 “ProtobufTest” 项目——》选择“属性”
选择 “C/C++” ——》“常规”——》“附加包含目录”——》“编辑”
输入之前下载的源代码所在目录
E:\protobuf-cpp-3.21.4\protobuf-3.21.4\src
选择“链接器”——》“常规”——》“附加库目录”
输入之前 VS 编译的 protobuf 解决方案所生成的 lib 所在目录
E:\protobuf-cpp-3.21.4\protobuf-3.21.4\build\Debug
选择“链接器”——》“输入”——》“附加依赖项”
输入 libprotobufd.lib 和 libprotocd.lib
至此全部设置完毕!
点击“生成”
运行后输出