【ProtoBuf】ProtoBuf基础与安装

本篇文章介绍 C++ 使用方向

文章目录

  • ProtoBuf简介
  • ProtoBuf安装
    • Windows
    • Linux

ProtoBuf简介

ProtoBuf(全称为 Protocol Buffer)是一种序列化结构数据的方法
序列化是将对象转换为可存储的或传输的格式的过程,通常用于数据交换或持久化存储。我们在C++/Java中编写的类不适合直接进行存储或者传输,需要转换为字节序列
常见的序列化格式包括Json、XML,二者是具有一定规则的字符串和二进制格式

ProtoBuf 类比与 XML,是一种灵活,高效,自动化机制的结构数据序列化方法,但是比 XML 更小、更快、更简单,因为其使用二进制存储

ProtoBuf 的优点

  • 语言无关、平台无关:ProtoBuf 支持C++、Java、Python 等多种语言,支持多个平台,Windows、Linux、Mac
  • 高效:序列化反序列化速度很快,快于Json的处理速度;序列化后的体积相比Json和XML更小,适合网络传输
  • 扩展性、兼容性好:可以更新数据结构,而不影响和破坏原有的旧程序

ProtoBuf 的缺点

  • 应用不够广(相比XML和Json)
  • 二进制格式可读性差

ProtoBuf 的使用
常规的类框架如下:
在这里插入图片描述

而ProtoBuf 通过 protoc 编译器根据属性帮我们自动生成 get/set方法序列化反序列化方法
protoc 编译器编译.proto文件,生成对应语言的库文件/包供我们使用
在这里插入图片描述
流程如下:

  1. 编写.proto文件,定义结构对象(message)及属性内容,相当于class
  2. 使用protoc编译器编译.proto文件,生成一系列接口代码,存放在新生成的头文件和源文件中
  3. 依赖生成的接口,将编译生成的头文件包含进我们的代码中,实现对 .proto 文件中定义的字段进行设置和获取,和对 message 对象进行序列化和反序列化

总的来说:ProtoBuf 是需要依赖通过编译生成的头文件和源文件来使用的

ProtoBuf安装

Windows

下载 ProtoBuf 编译器:https://github.com/protocolbuffers/protobuf/releases

在这里插入图片描述

下载后将压缩包解压到本地目录下。解压后的文件内包含 bin、include文件
在这里插入图片描述

配置环境变量,如此可以找到protoc编译器
把解压后文件的bin目录的路径配置到系统环境变量的Path中
在这里插入图片描述
检查是否配置成功:
打开cmd,输入

protoc --version #查看版本

有显示版本说明成功
在这里插入图片描述

Linux

下载 ProtoBuf 前一定要安装依赖库:autoconf automake libtool curl make g++ unzip
如未安装,安装命令如下:

Ubuntu

sudo apt-get install autoconf automake libtool curl make g++ unzip -y

CentOS

sudo yum install autoconf automake libtool curl make gcc-c++ unzip

下载 ProtoBuf 编译器:https://github.com/protocolbuffers/protobuf/releases

在这里插入图片描述
选择合适的版本,右键复制链接
后续命令如下:

#下载
wget [链接]
#解压
unzip [压缩包]

安装ProtoBuf
进入解压好的文件,执行如下命令:

# 第⼀步执⾏autogen.sh,但如果下载的是具体的某⼀⻔语⾔,不需要执⾏这⼀步。
./autogen.sh # 第⼆步执⾏configure,有两种执⾏⽅式,任选其⼀即可,如下:
# 1、protobuf默认安装在 /usr/local ⽬录,lib、bin都是分散的
./configure 
# 2、修改安装⽬录,统⼀安装在/usr/local/protobuf下
./configure --prefix=/usr/local/protobuf

再依次执行

make 		#执行15分钟左右
make check  #执行15分钟左右
sudo make install

如果在make check出现错误,例如:
在这里插入图片描述
出现以上错误的原因是test的模块⾥⾯有⾮常多的测试⽤例,这些⽤例对服务器环境要求特别严格,需要增⼤下swap分区,具体操作可参考:
https://blog.csdn.net/AlexWang30/article/details/90341172
https://blog.csdn.net/nibiewuxuanze/article/details/127980216
(建议先扩大到3G,再执行make check,不行就5G,再不行就8G,博主是8G才可以)
执行make check,出现以下内容就可以执行sudo make install
在这里插入图片描述
到此,如果在执行./configure时,选择了第⼀种执行方式,那么到这就可以正常使用 protobuf 了。如果选择了第⼆种执行方式,即修改了安装⽬录,那么还需要在 /etc/profile 中添加⼀些内容:

sudo vim /etc/profile#将如下内容写入文件中#(动态库搜索路径)程序加载运⾏期间查找动态链接库时指定除了系统默认路径之外的其他路径
exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
#(静态库搜索路径)程序编译期间查找动态链接库时指定查找共享库的路径
exportLIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
#执⾏程序搜索路径
exportPATH=$PATH:/usr/local/protobuf/bin/
#c程序头⽂件搜索路径
exportC_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
#c++程序头⽂件搜索路径
exportCPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
#pkg-config路径
exportPKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/

写入后,保存退出,执行命令使配置生效

source /etc/profile

最后,到了激动人心的时间,检查是否安装成功
查看版本号

protoc --version

如果成功显示版本,说明安装成功,没有则还需要检查前面的哪部分出错了,祝安装一切顺利
在这里插入图片描述


以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.13寸电子墨水屏HINK-E0213+esp8266

记录好数字 2.13寸电子墨水屏HINK-E0213esp8266 声明:大部分资料来源于微雪电子http://微雪电子-官网 https://www.waveshare.net/ 前言 很久以前买的一块电子墨水屏,运气很好,这个型号HINK-E0213资料很全,而且微雪官网也有相关电路资料http://2.13inch e-Paper HAT - Waves…

【GaussDB】产品简介

产品定位 GaussDB 200是一款具备分析及混合负载能力的分布式数据库,支持x86和Kunpeng硬件架构,支持行存储与列存储,提供PB(Petabyte)级数据分析能力、多模分析能力和实时处理能力,用于数据仓库、数据集市、实时分析、实时决策和混…

【UI】将 naive ui 的 message 封装进axios 中,关于naiveui的message相关的用法

文章目录 前言在setup外进行使用直接包裹使用vue 单文件中使用 参考文章: 关于naiveui的message相关的用法 前言 最近新建了一个vite vu3 的项目,完全是从0 到1 ,封装到request 的时候 想对axios 请求做一个全局的处理,但发现…

【尚硅谷】FreeRTOS学笔记(更新中更新时间2024.10.12)

在网上看到的一段很形象的描述,放在这里给大家娱乐一下。 裸机开发:n个人拉屎,先进去一个拉完,下一个再来。看门狗:如果有人拉完屎还占着,茅坑刷视频,把他拖出去中断系统:n个人拉屎&…

两三年没涨薪了

前几天到上海见合伙人,有好几位合伙人也都是中型或者是大厂的骨干,基本上是在P8这个级别,大家谈到了几个共同点。 几个典型的现象说一下,既是新闻,也是旧故事。天下的事都雷同。第一个,老板换了&#xff0c…

LVS-DR+Keepalived 高可用群集部署

LVS-DRKeepalived 高可用群集部署 Keepalived 的工作原理LVSKeepalived 高可用群集部署配置负载调度器(主、备相同)关闭防火墙和核心防护及准备IPVS模块配置keeplived(主、备DR 服务器上都要设置)启动 ipvsadm 服务调整 proc 响应…

机器学习中的模型设计与训练流程详解

目录 前言1. 模型设计1.1 数据特性分析1.2 计算资源限制1.3 应用场景需求 2. 模型训练2.1 训练集与验证集的划分2.2 损失函数的选择2.3 模型参数更新 3. 优化方法3.1 梯度下降法3.2 正则化方法 4. 模型测试4.1 性能评估指标4.2 模型的泛化能力 5. 模型选择5.1 数据规模与模型复…

集合框架06:Vector集合使用

1.视频链接:13.13 Vector使用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw/?p13&spm_id_from333.1007.top_right_bar_window_history.content.click&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b52.代码示例: package com.yu…

Fetch 与 Axios:JavaScript HTTP 请求库的详细比较

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

初知C++:AVL树

文章目录 初知C:AVL树1.AVL树的概念2.AVL树的是实现2.1.AVL树的结构2.2.AVL树的插入2.3.旋转2.4.AVL树的查找2.5.AVL树平衡检测 初知C:AVL树 1.AVL树的概念 • AVL树是最先发明的自平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性…

python如何对变量赋值

Python 中的变量赋值不需要类型声明。 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 等号()用来给变量赋值。 等号(&…

SpringBoot 整合 阿里云 OSS图片上传

一、OOS 简介 ‌阿里云OSS(Object Storage Service)是一种基于云存储的产品,适用于存储和管理各种类型的文件,包括图片、视频、文档等。‌ 阿里云OSS具有高可靠性、高可用性和低成本等优点,因此被广泛应用于各种场景&…

2013年国赛高教杯数学建模A题车道被占用对城市道路通行能力的影响解题全过程文档及程序

2013年国赛高教杯数学建模 A题 车道被占用对城市道路通行能力的影响 车道被占用是指因交通事故、路边停车、占道施工等因素,导致车道或道路横断面通行能力在单位时间内降低的现象。由于城市道路具有交通流密度大、连续性强等特点,一条车道被占用&#x…

el-image预览时和el-table边框出现样式穿透问题处理

el-image预览时和el-table边框出现样式穿透问题处理 如图所示 我们只需要在当前组件加一个css即可解决问题 <style lang"scss" scoped> :deep(.el-table__cell) {position: static !important; } </style>

【Golang】关于Go语言中的定时器原理与实战应用

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

结构体 超详解

目录 1. 结构体的声明与创建 1.1 结构体类型的定义声明&#xff08;类型&#xff09; 1.2 结构体变量的创建和初始化&#xff08;变量&#xff09; 1.3 结构体变量的特殊声明&#xff08;类型和变量&#xff09; 1.3.1 定义时创建变量 1.3.2 结构体的不完全声明&#xff…

解决重写QSilder::sliderPress后点击位置与滑块显示位置不一样的问题

如下代码所示&#xff0c;我是用的是事件过滤器&#xff0c;也可以重写QSlider。 bool KuGouApp::eventFilter(QObject *watched, QEvent *event) {if(watched ui->progressSlider) {if (event->type()QEvent::MouseButtonPress) //判断类型{auto mouseEvent…

XILINX MIG驱动

简介 框架图 本章节主要针对MIG读写做详细介绍,首先创建BLOCK DESIGN,工程连接如下图所示: MIG IP介绍 DATAMOVER的配置这里不再做介绍,结合上篇文章讲到DATAMOVER对BRAM进行读写操作,这里通过AXI桥再加一个MIG模块,MIG模块的配置和说明如下: 1、Clock Period:…

FPAG学习(5)-三种方法实现LED流水灯

目录 1.移位实现LED流水灯 1.1创建工程及源文件代码 1.1.1源代码 1.1.2仿真代码 1.1.3仿真 1.2实验结果 1.2.1总结 2.循环移位实现LED流水灯 3.38译码器实现LED流水灯 3.1原理 3.2源程序 1.移位实现LED流水灯 1.1创建工程及源文件代码 1.1.1源代码 利用计数器计数到…

Mybatis Plus连接使用ClickHouse也如此简单

通过阅读列式数据库ClickHouse官网&#xff0c;不难看出它有支持JDBC规范的驱动jar包&#xff0c;可以直接集成到Object Relational Mapping框架等&#xff0c;下面我用SpringBootMybatisPlus环境连接ClickHouse来演示一下 集成步骤 1.Maven引入ClickHouse提供的JDBC依赖 <…