ProtoBuf安装及避坑指南

news2024/11/17 5:49:26

文章目录

    • 安装前注意事项(避坑)
    • ProtoBuf在Linux下的安装
    • protoBuf 测试demo

安装前注意事项(避坑)

1.安装前,我们需要升级g++,使用较新的g++编译器。
在这里插入图片描述2.在安装过程中,出现问题,可以选择安装其他版本,在加压文件下执行make uninstall指令就能卸载,因为这是源码安装,不是源码安装可以使用yum remote指令

3.安装完protobuf,如果在vscode在开发,那么可能会遇到如下图问题,cpp文件检测不到头文件,这是vscode的插件报的错,插件有时候不准确的,我们应该编译器是否有报错。

在这里插入图片描述

ProtoBuf在Linux下的安装

1、下载ProtoBuf

下载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

可以不⽤下载最新版本,课件以v21.11为例,具体的下载根据⾃⼰电脑情况选择。

在这里插入图片描述在这⾥我们希望⽀持全部语⾔,所以选择protobuf-all-21.11.zip,右键将下载链接复制出来。

下载命令:

wget https://github.com/protocolbuffers/protobuf/releases/download/v21.11/protobuf-all-21.11.zip

注意:使用wget来下载可能会文件缺失,我们可以在windows下载,然后在xshell里使用rz 指令。

下载完成后,解压zip包:

unzipprotobuf-all-21.11.zip

解压完成后,会⽣成 protobuf-21.11 ⽂件,进⼊⽂件:

cd protobuf-21.11

2、安装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可能会失败,pb测试模块的问题,如果想解决可以安装如下链接操作https://blog.csdn.net/AlexWang30/article/details/90341172

在这里插入图片描述

到此,需要你回忆⼀下在执⾏configure时,如果当时选择了第⼀种执⾏⽅式,也就是./configure ,那么到这就可以正常使⽤protobuf了。如果选择了第⼆种执⾏⽅式,即修改了安装⽬录,那么还需要在/etc/profile(系统配置文件)中添加⼀些内容:

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

最后⼀步,重新执⾏/etc/profile⽂件:

source /etc/profile

3、检查是否安装成功
输入 protoc --version 查看版本,有显示说明安装成功。

protoc --version
打印
libprotoc 3.21.11

protoBuf 测试demo

1.准备两个文件

test.cc 文件

#include <iostream> 
#include "contacts.pb.h"
 

int main() { 
    std::string people_str; 

    {
        // 对⼀个联系⼈的信息使⽤ PB 进⾏序列化,并将结果打印出来。
        contacts::PeopleInfo people; 
        people.set_name("张珊"); 
        people.set_age(20); 
        if (!people.SerializeToString(&people_str)) { 
            std::cerr << "序列化联系⼈失败!" << std::endl; 
            return -1;
        }
        std::cout << "序列化成功,结果:" << people_str << std::endl; 
    }
    
    {
        // 对序列化后的内容使⽤ PB 进⾏反序列,解析出联系⼈信息并打印出来。
        contacts::PeopleInfo people; 
        if (!people.ParseFromString(people_str)) { 
            std::cerr << "反序列化联系⼈失败!" << std::endl; 
            return -1;
        } 
        std::cout << "反序列化成功!" << std::endl
                  << "姓名: " << people.name() << std::endl
                  << "年龄: " << people.age() << std::endl;
    }

    return 0;
} 

contacts.proto 文件

// 首行:语法指定行
syntax = "proto3";
package contacts;

// 定义联系人message
message PeopleInfo {
  string name = 1;  // 姓名
  int32 age = 2;    // 年龄  
}

2.执行一下语句

protoc --cpp_out=. contacts.proto
g++ -o testPB test.cc contacts.pb.cc -lprotobuf -std=c++11
./testPB

# 打印如下说明成功了

[YYK@VM-8-7-centos fast_start]$ ./testPB
序列化成功,结果:
张珊
反序列化成功!
姓名: 张珊
年龄: 20

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NFTScan:05.15~05.21 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.05.15 ~ 2023.05.21 NFT Hot News&#xff1a;NFT 热点资讯 01/ DID 解决方案提供商 Lifeform 以 3 亿美元估值完成 IDG Capital 领投的 B 轮融资 5 月 15 日&#xff0c;去中心化…

Rocketmq常用使用场景

RocketMQ 是阿里开源的分布式消息中间件&#xff0c;跟其它中间件相比&#xff0c;RocketMQ 的特点是纯JAVA实现 基础概念 Producer&#xff1a; 消息生产者&#xff0c;负责产生消息&#xff0c;一般由业务系统负责产生消息 Producer Group&#xff1a; 消息生产者组&#xf…

ESP32CAM---利用Vscode阅读源码

前言 &#xff08;1&#xff09;首先&#xff0c;我在此吐槽一些&#xff0c;arduino平台的代码阅读功能&#xff0c;是真滴垃圾。气死我了。配置这玩意搞了半天&#xff0c;还没搞好。 &#xff08;2&#xff09;最后我决定使用Vscode阅读arduino的代码。arduino IDE负责编译程…

智能工厂已成为制造业数字化转型的重心

我国“十四五”规划纲要提出&#xff0c;要深入实施智能制造和绿色制造工程&#xff0c;发展服务型制造新模式&#xff0c;推动制造业高端化智能化绿色化。随着5G等新一代信息技术与制造业不断深度融合&#xff0c;制造业的智能化发展成为未来我国制造业转型升级的重要方向。《…

MyBatisPlus快速入门(一)MyBatisPlus简介、历史和优势

一、什么是 MyBatisPlus&#xff1f;二、MyBatisPlus 相关文档2.1 官网2.2 Github源码2.3 官方文档 三、MyBatisPlus 的历史四、MyBatisPlus 的特性和优势4.1 特性4.2 优势 五、如何学习 MyBatisPlus & 专栏计划 一、什么是 MyBatisPlus&#xff1f; MyBatisPlus&#xff…

MyBatis中使用第三方分页插件PageHelper完成分页功能

文章目录 一、前言二、基于插件拦截方式1、自定义插件2、使用第三方插件完成分页1、分页插件的配置2、分页插件的使用 一、前言 分页是web应用程序非常重要的一个技术。数据库中的数据可能是成千上万的&#xff0c;不可能把这么多的数据一次显示在浏览器上面。一般根据每行数据…

2023年4月CSDN客服月报|解决3个重大问题和26个次要问题,采纳1个用户建议

听用户心声&#xff0c;解用户之需。hello&#xff0c;大家好&#xff0c;这里是《CSDN客诉报告》第19期&#xff0c;接下来就请大家一同回顾我们4月份解决的bug&#xff5e; 一、重大问题 1、【猿如意】ChitGPT近期老是提示“我回答不过来”的问题 反馈量&#xff1a;10 2、…

【星戈瑞】Sulfo-Cyanine7 maleimide磺化CY7标记马来酰亚胺

水溶性Cyanine7 mal是一种常用的细胞标记物&#xff0c;可以被用于细胞荧光成像等应用中。它的分子结构中含有Cyanine7和mal两部分&#xff0c;其中Cyanine7是一种红外荧光染料&#xff0c;可以发出红外光&#xff0c;而mal则是一种水溶性的化合物&#xff0c;可以使Cyanine7分…

响应式与自适应的区别

响应式与自适应的区别&#xff1a; 响应式&#xff1a;一套适配多端适配不同的屏幕设备&#xff0c;即不同的视口分辨率 自适应&#xff1a;多套页面不同视口分辨率大小显示同样的网页rem、百分比等相对单位 注意&#xff1a; 在开发中&#xff0c;项目的响应式&#xff0c;一些…

Java技术接单

今天给大家介绍一个阶段性&#xff08;周期性&#xff09;能获取一定收益的Java技术接单群&#xff0c;分享给大家&#xff01;主要对搞Java的粉丝有帮助&#xff0c;因为可以赚点小钱&#xff0c;对Java技术的要求不高&#xff01; 那些感兴趣或者想直接加技术群的我给大家讲一…

JAVA8 Stream

1 Steam流式思想概述 Stream和IO流(InputStream/OutputStream)没有任何关系&#xff0c;请暂时忘记对传统IO流的固有印象&#xff01; Stream流式思想类似于工厂车间的“生产流水线”&#xff0c;Stream流不是一种数据结构&#xff0c;不保存数据&#xff0c;而是对数据进行加…

Vue 3 第二十一章:组件九(组件高级特性-组件的混入和继承)

文章目录 1. 组件的混入2. 组件的继承总结 Vue 中的组件混入和继承功能允许我们在多个组件之间共享代码&#xff0c;从而提高代码的可重用性和可维护性。 1. 组件的混入 混入是一种将多个对象合并为一个对象的技术。在 Vue 3 中&#xff0c;我们可以使用 mixins 属性来定义混…

ThingsBoard的Actor模型

0、概述 下面是我从网上查阅资料总结下来的. 1、背景 多线程编程是每个程序员的基本功,同时也是开发中的难点,处理各种“锁”的问题是让人十分头痛的一件事。例如,设计一个转账功能,怎么保证在多线程下能正常运行?你可能会说,这个简单,在进行转账操作前,先对两个账户…

【实战项目】使用C语言和easyX,一起完成数字拼图游戏吧!快来挑战一下吧~

这款简易的拼图游戏包含了15个数字方块&#xff0c;你需要将它们按照顺序排列成1~15的数字&#xff0c;就能完成游戏。 在游戏中会记录你完成拼图所用的时间。我想强调的是&#xff0c;一个精彩的游戏并不一定需要使用图片。只要功能和手感都做得出色&#xff0c;游戏同样能够…

从0到1,深刻理解Linux权限

[Linux]深刻理解Linux权限 从0到1&#xff0c;深刻理解Linux权限Linux权限的概念Linux权限管理Linux文件访问者文件类型和访问权限文件类型访问权限 文件访问权限设置修改文件权限修改文件拥有者修改所属组 umask掩码目录权限目录权限问题粘滞位 权限总结&#xff1a; 从0到1&a…

1688商品详细信息价格SKU接口

随着新零售时代的到来&#xff0c;越来越多的企业开始关注电商平台&#xff0c;其中1688平台作为国内重要的B2B电商平台之一&#xff0c;对于企业发展、产品销售等方面有着重要的价值。在使用1688平台出售商品时&#xff0c;如何优化商品详情页、提高搜索排名、增加商品曝光度&…

PG15.3.0源码编译安装日志插件pgbadger(上)

一、开启相关日志 修改后alter一定要重启&#xff0c;才会修改 pg_ctl restart -D /usr/local/pgsql/data -l logfile按照下面的方法一个个修改。 log_destination csvlog # 可选 logging_collector on log_min_duration_statement 0 log_line_prefix %t [%p]: us…

(转载)MATLAB智能算法30个案例分析(2)——基于遗传算法和非线性规划的函数寻优算法

以下内容大部分来源于《MATLAB智能算法30个案例分析》&#xff0c;仅为学习交流所用。 1 理论基础 1.1 非线性规划 非线性规划是20世纪50年代形成的一门新兴学科。1951年库恩和塔克发表的关于最优性条件(后来称为库恩塔克条件)的论文是非线性规划诞生的标志。非线性规划研究…

聚会游戏玩什么?UMO轻松炒热气氛

UMO是一款有趣的多人益智桌游&#xff0c;考验玩家耐力和技巧的比拼&#xff01;玩家将在游戏中通过特定的规则来出牌&#xff0c;谁先出完所有牌谁就赢&#xff0c;游戏非常讲究策略和运气哦~ 当玩家手上只剩一张牌时&#xff0c;必须喊出UMO&#xff01;游戏因此得名。【数字…

自学网络安全,最应该先学的五大技能树是什么?(附学习路线图)

前言&#xff1a; 近几年网络安全事件频发&#xff0c;国家对于互联网信息安全和互联网舆情的重视程度不断提升有关&#xff0c;全球网络安全岗位缺口达500万&#xff0c;中国约100万&#xff0c;产业人才需求逐年增加&#xff0c;网络安全行业的相关岗位成为炙手可热的职业。…