protobuf 的安装

news2024/11/24 18:42:21

protobuf 的安装

  • 安装步骤
  • 最后的解决办法
  • git clone遇到的问题
    • 解决办法:
  • 后续遇到的问题
    • 1.果然还是报错了:
  • 2023-06-05更新
  • Abseil的安装
  • 2023-06-06更新
  • 代码

安装步骤

这个博主的操作对我有效,这个写的好

apt-get install autoconf automake libtool curl make g++ unzip(成功)
git clone https://github.com/protocolbuffers/protobuf.git(成功)
cd protobuf (成功)
git submodule update --init --recursive(成功) 
make (success)
sudo make install (success)
sudo ldconfig (success)

在这里插入图片描述
在这里插入图片描述

最后的解决办法

直接输入下面的命令,直接安装成功了,暂时先用这个libprotoc 3.0.0吧

apt install protobuf-compiler
protoc --version

在这里插入图片描述

git clone遇到的问题

Failed to connect to github.com port 443: 拒绝连接

解决办法:

在hosts文件(window端的路径在:C:\Windows\System32\drivers\etc\hosts)的末尾添加:

199.232.69.194 gitub.global.ssl.fastly.net
140.82.114.3 github.com
185.199.108.153	assets-cdn.github.com
185.199.109.153 assets-cdn.github.com
185.199.110.153 assets-cdn.github.com
185.199.111.153 assets-cdn.github.com

在这里插入图片描述

后续遇到的问题

1.果然还是报错了:

root@wxncom-virtual-machine:/home/wxncom/shared_bike/demo/protobuf/shared_bike_demo# g++  -std=c++11   example.cc bike.pb.cc -lprotobuf
In file included from example.cc:1:0:
bike.pb.h:9:10: fatal error: google/protobuf/stubs/common.h: 没有那个文件或目录
 #include <google/protobuf/stubs/common.h>
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
In file included from bike.pb.cc:5:0:
bike.pb.h:9:10: fatal error: google/protobuf/stubs/common.h: 没有那个文件或目录
 #include <google/protobuf/stubs/common.h>
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
root@wxncom-virtual-machine:/home/wxncom/shared_bike/demo/protobuf/shared_bike_demo# ls
bike.pb.cc  bike.pb.h  bike.proto  example.cc
root@wxncom-virtual-machine:/home/wxncom/shared_bike/demo/protobuf/shared_bike_demo# sudo apt-get install libprotobuf-dev protobuf-compiler
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
protobuf-compiler 已经是最新版 (3.0.0-9.1ubuntu1.1)。
下列【新】软件包将被安装:
  libprotobuf-dev libprotobuf-lite10
升级了 0 个软件包,新安装了 2 个软件包,要卸载 0 个软件包,有 46 个软件包未被升级。
需要下载 1,059 kB 的归档。
解压缩后会消耗 8,508 kB 的额外空间。
获取:1 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libprotobuf-lite10 amd64 3.0.0-9.1ubuntu1.1 [98.0 kB]
获取:2 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libprotobuf-dev amd64 3.0.0-9.1ubuntu1.1 [961 kB]
已下载 1,059 kB,耗时 3(367 kB/s)     
正在选中未选择的软件包 libprotobuf-lite10:amd64。
(正在读取数据库 ... 系统当前共安装有 181625 个文件和目录。)
正准备解包 .../libprotobuf-lite10_3.0.0-9.1ubuntu1.1_amd64.deb  ...
正在解包 libprotobuf-lite10:amd64 (3.0.0-9.1ubuntu1.1) ...
正在选中未选择的软件包 libprotobuf-dev:amd64。
正准备解包 .../libprotobuf-dev_3.0.0-9.1ubuntu1.1_amd64.deb  ...
正在解包 libprotobuf-dev:amd64 (3.0.0-9.1ubuntu1.1) ...
正在设置 libprotobuf-lite10:amd64 (3.0.0-9.1ubuntu1.1) ...
正在设置 libprotobuf-dev:amd64 (3.0.0-9.1ubuntu1.1) ...
正在处理用于 libc-bin (2.27-3ubuntu1.5) 的触发器 ...
root@wxncom-virtual-machine:/home/wxncom/shared_bike/demo/protobuf/shared_bike_demo# g++  -std=c++11   example.cc bike.pb.cc -lprotobuf

感谢这位老哥的博客,成功解决问题!

sudo apt-get install libprotobuf-dev protobuf-compiler

2023-06-05更新

第一步:
sudo apt-get install autoconf automake libtool curl make g++ unzip
第二步:(第二步不可能不成功,如果你第二步执行出错,说明你的网络有问题,搞一个好点的热点就可以了)
sudo git clone https://github.com/google/protobuf.git
cd protobuf
sudo apt install libtool-bin
sudo git submodule update --init --recursive

第三步:
先执行 1),如果提示:sudo: ./autogen.sh:找不到命令,则执行2)的5条语句
#1) sudo ./autogen.sh
#2)5条语句
sudo ./update_subtrees.sh
sudo ./regenerate_stale_files.sh
sudo ./google3_export_generated_files.sh
sudo ./fix_permissions.sh
sudo ./generate_descriptor_proto.sh

sudo ./configure # (如果执行失败,先不要管)
sudo make#(如果提示"make: *** 没有指明目标并且找不到 makefile。 停止。" , 则先执行 cmake .  再执行make)

我在make的过程中出现了如下错误:
在这里插入图片描述

不要怕,兵来将挡水来土掩
locate libabsl.so
确实系统没有这个库

那就下载这个库:
sudo apt-get install apt-file
apt-file update
apt-file search libabsl.so # labsl

此时,你再去查
locate libabsl.so
哦!Mygod!还是没有!

再次尝试!这次我问了gpt3.5!
sudo apt-get install build-essential cmake git
git clone https://github.com/abseil/abseil-cpp.git
遇到问题:
fatal: unable to access 'https://github.com/abseil/abseil-cpp.git/': Failed to connect to github.com port 443: 拒绝连接


git clone https://github.com/abseil/abseil-cpp.git(多尝试了几次,不知道怎么就成功了)
cd abseil-cpp
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
make
sudo make install
cd ..
cd ..

我执行了一下make,还是报错
然后我又执行cmake .发现有几个错误:
CMake Error: install(EXPORT "abslTargets" ...) includes target "hash_testing" which requires target "gmock" that is not in the export set.
CMake Error: install(EXPORT "abslTargets" ...) includes target "scoped_mock_log" which requires target "gmock" that is not in the export set.
CMake Error: install(EXPORT "abslTargets" ...) includes target "scoped_mock_log" which requires target "gmock" that is not in the export set.
CMake Error: install(EXPORT "abslTargets" ...) includes target "random_mocking_bit_gen" which requires target "gmock" that is not in the export set.
CMake Error: install(EXPORT "abslTargets" ...) includes target "random_mocking_bit_gen" which requires target "gmock" that is not in the export set.


我又重新cmake 了几次,当我再次make的时候,居然成功了!
如果你们还没有成功,可以去搜一下Abseil的安装(Abseil C++库通常被简称为“absl”。)

在这里插入图片描述

第四步:
sudo make check(执行报错,不管他)
sudo sudo make install
sudo ldconfig
第五步:
protoc --version

Abseil的安装

git clone https://github.com/abseil/abseil-cpp
cd abseil-cpp
mkdir bulid     #用于构建
mkdir install   #用于安装

cd bulid/
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/abseil-cpp/install/
make && make install
cp -R /opt/abseil-cpp/install/include/absl/ /usr/include/
find ./ -name "*.o" | xargs ar cr libabsl.a
cp libabsl.a /usr/lib

2023-06-06更新

又遇到了问题,说我至少要用c++14的版本,这个ok,简单处理.

但是他又说我的protobuf的3.0.0版本太高了
使用这个博客里面的版本

wget https://github.com/google/protobuf/archive/v2.6.1.zip

sudo apt-get install fastjar
jar xvf ./v2.6.1.zip  

unzip protobuf-2.6.1.zip #这里我下载得到的文件是v2.6.1,所以改为unzip v2.6.1
cd protobuf-2.6.1
chmod 777 ./autogen.sh
./autogen.sh

代码

  1. bike.proto
syntax = "proto2"; //协议版本

package tutorial;//包,我理解为命名空间

message mobile_request//短信请求
{
    required string mobile = 1;//一定要写一个编号,有多个就1,2,3
}

message mobile_response//短信回应
{
    required int32 code   = 1;   //响应代号
    required int32 icode  = 2;   //验证码
    optional string data  = 3;   //失败原因
}


message login_request
{
    required string mobile  = 1;    // 手机号码
    required int32  icode   = 2;    // 验证码
}


message login_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
}

message recharge_request
{
    required string mobile  = 1;    // 手机号码
    required int32  amount  = 2;    // 充值金额
}


message recharge_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    required int32  balance = 3;    // 最新的余额
}

message account_balance_request //balance:余额
{
    required string mobile = 1;//回应一个手机号
}

message account_balance_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    required int32  balance = 3;
}

message list_account_records_request
{
    required string mobile = 1;
}

message list_account_records_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    message account_record
    {
        required int32  type      = 1; // 0 : 骑行消费,  1 : 充值, 2 : 退款
        required int32  limit     = 2; // 消费或者充值金额
        required uint64 timestamp = 3; // 记录发生时的时间戳
    }

    repeated account_record records = 3;
}

message list_travel_records_request
{
    required string mobile = 1;
}

message list_travel_records_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    message travel_record
    {
        required uint64 stm      = 1;   // start timestamp
        required uint32 duration = 2;   // 骑行时长
        required uint32 amount   = 3;   // 所耗金额
    }

    required double              mileage   = 3; // 里程
    required double              discharge = 4; // 排放
    required double              calorie   = 5; // 卡路里
    repeated travel_record       records   = 6;
}

protoc --cpp_out=. bike.proto//它会在当前目录下会生成两个C++文件
  1. 设置环境变量
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
  1. example1.cc
#include "bike.pb.h"
#include <string>
#include <iostream>

using namespace std;
using namespace tutorial;

int main(void)
{
    std::string data; // 存储序列化的信息
    // 客户端发出请求
    {
        mobile_request mr;
        mr.set_mobile("12345678910");

        mr.SerializeToString(&data); // 打包变成2进制数据
        cout << "序列化之后的数据 :[" << data.size() << "]" << endl;
        cout << data << endl;

        // 反序列化
        cout << (int)*((char *)data.c_str()) << endl;
        cout << (int)*((char *)(data.c_str() + 1)) << endl;

        // 客户端发送data send(sockfd,data.c_str(),data.length());
    }
    // 服务器接收请求
    {
        // receive(sockfd,data,...);
        mobile_request mr;
        mr.ParseFromString(data);
        cout << "客户端手机号码 : " << mr.mobile() << endl;
    }

    return 0;
}
// g++ -std=c++11   example.cc bike.pb.cc -lprotobuf -pthread
g++ -std=c++11   example.cc bike.pb.cc -lprotobuf -pthread
#include "bike.pb.h"
#include <string>
#include <iostream>

using namespace std;
using namespace tutorial;

int main(void)
{
    std::string data; // 存储序列化的信息
    // 客户端发出请求
    {
        list_account_records_response larr;
        larr.set_code(200);
        larr.set_desc("ok");
        // add five records
        for (int i = 0; i < 5; ++i)
        {
            list_account_records_response_account_record *ar = larr.add_records();
            ar->set_type(0);
            ar->set_limit(i * 100);
            ar->set_timestamp(time(NULL));
        }

        printf("records size: %d \n", larr.records_size());

        larr.SerializeToString(&data); // 打包变成2进制数据
        // 客户端发送data send(sockfd,data.c_str(),data.length());
    }
    // 服务器接收请求
    {
        // receive(sockfd,data,...);
        list_account_records_response larr;
        larr.ParseFromString(data);

        printf("records size :%d \n", larr.records_size());
        printf("code :%d \n", larr.code());
        for (int i = 0; i < larr.records_size(); ++i)
        {
            const list_account_records_response_account_record &ar = larr.records(i);
            printf("limit : %d\n", ar.limit());
        }
    }

    return 0;
}
// g++ -std=c++11   example1.cc bike.pb.cc -lprotobuf -pthread

g++ -std=c++11   example1.cc bike.pb.cc -lprotobuf -pthread

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

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

相关文章

【AUTOSAR】Bootloader说明(二)---- 初始化流程及配置

按照DSP复位后的执行情况&#xff0c;Boot-loader分为以下几部分&#xff1a; DSP启动及系统初始化RAM自检应用程序有效性检查UDS命令处理FALSH操作 DSP启动及系统初始化 选择从FLASH启动 DSP的启动模式配置为从FLASH启动【参考】&#xff0c;硬件引脚配置如下&#xff1a; 引…

Vue.js 中的 Nuxt.js 是什么?如何使用 Nuxt.js?

Vue.js 中的 Nuxt.js 是什么&#xff1f;如何使用 Nuxt.js&#xff1f; Nuxt.js 是一个基于 Vue.js 的服务端渲染应用框架&#xff0c;它提供了一种简单的方式来创建基于 Vue.js 的应用程序。Nuxt.js 提供了许多有用的功能&#xff0c;如自动路由、代码分割、服务端渲染等&…

你了解 .gitkeep文件吗?

目录 简介 作用 例程 简介 本文主要介绍在git中, .gitkeep的作用。 作用 git无法追踪一个空的文件夹&#xff0c;当用户需要追踪(track)一个空的文件夹的时候&#xff0c;按照惯例&#xff0c;大家会把一个称为.gitkeep的文件放在这些文件夹里。 例程 就个人而言&#…

VST的天花板?苹果Vision Pro解析

看了那么多预测、分析之后&#xff0c;苹果MR头显&#xff08;Apple Vision Pro&#xff09;真正的来了。 十多年前&#xff0c;Oculus Rift DK1开启了近代新一轮VR热潮。十年之后&#xff0c;发展未及预期&#xff0c;VR仍未走向大众。如今整个AR/VR行业都在期待&#xff0c;…

一文带你了解11个Linux最常用命令

文章目录 1. 前言2. 文件与目录的查看:ls3. 显示当前路径:pwd4. 创建目录:mkdir5. 切换目录:cd6. 创建文件:touch7. 查看指定文件:cat8. 向终端输出:echo9. 树形结构显示目录: tree10. 删除文件或目录: rm11.复制文件或目录: cp12.文本编辑器: vim13. 总结 1. 前言 Linux的命令…

强大交互功能,真实产品体验一步到位!

动态交互效果是原型项目的灵魂&#xff0c;也是原型与设计产出物的关键区别。一个好的交互设置不仅能准确地传达静态界面难以表达的逻辑、流程和细节体验&#xff0c;还能呈现出丰富精彩的视觉效果&#xff0c;提高项目的质量。对于产品经理来说&#xff0c;学会交互设计是必不…

教你一招,能解决90%的机房问题

近年来&#xff0c;随着科技的发展&#xff0c;蓄电池的使用十分普遍&#xff0c;而蓄电池的广泛应用&#xff0c;也出现了一系列的问题&#xff0c;如不及时处理&#xff0c;可能给系统造成更严重的损失。 为什么需要电池监控&#xff1f; 01.人工值班巡检已经不能满足机房电…

人工智能(pytorch)搭建模型8-利用pytorch搭建一个BiLSTM+CRF模型,实现简单的命名实体识别

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型8-利用pytorch搭建一个BiLSTMCRF模型&#xff0c;实现简单的命名实体识别&#xff0c;BiLSTMCRF 模型是一种常用的序列标注算法&#xff0c;可用于词性标注、分词、命名实体识别等任务。本…

chatgpt赋能python:Python如何到下一行

Python如何到下一行 Python是一种高级编程语言&#xff0c;因其简单易学、可读性高、广泛的应用领域与强大的工具库而迅速成为了广泛使用的语言之一。在Python编程中&#xff0c;换行操作是经常使用的操作。本文将介绍Python中的换行操作以及如何在代码中使用它。 换行符 换…

百度APP iOS端包体积50M优化实践(三) 资源优化

01 前言 百度APP iOS端包体积优化系列文章的前两篇重点介绍了包体积优化整体方案、各项优化收益和图片优化方案&#xff0c;图片优化是从无用图片、Asset Catalog和HEIC格式三个角度做深度优化。本文重点介绍资源优化&#xff0c;在百度APP实践中&#xff0c;资源优化包括大资…

存储过程和函数的区别

目录 零、基本格式 一、返回值 二、参数传递 1、存储过程 2、函数 三、执行方式 四、事务处理 1、存储过程 2、函数 五、数据库兼容性 课上老师提出的讨论题&#xff1a;存储过程和函数的区别&#xff1f; 有同学回复&#xff1a;在数据库后端编程中&#xff0c;存储…

Python数据攻略-Pandas的数据创建与基础特性

大家好&#xff0c;我是Mr数据杨&#xff01;今天将进入Python的Pandas数据世界&#xff0c;就像三国演义中的英雄们&#xff0c;用聪明才智塑造自己的命运。 记得三国中&#xff0c;周瑜曾利用兵法巧妙策划火烧赤壁&#xff0c;击败曹军。这就像创建一个Pandas DataFrame&…

布局量子计算工业应用!D-Wave正在“偷偷”干大事

​ &#xff08;图片来源&#xff1a;网络&#xff09; D-Wave 致力于让用户从量子计算中即时受益&#xff0c;而不必等到长远的未来。几十年来&#xff0c;这家加拿大公司一直努力将设备商业化&#xff0c;多家企业客户都在使用其量子计算来优化业务运营。例如&#xff0c;Pay…

Spark RDD容错机制

文章目录 一、RDD容错机制&#xff08;一&#xff09;血统方式&#xff08;二&#xff09;设置检查点方式 二、RDD检查点&#xff08;一&#xff09;RDD检查点机制&#xff08;二&#xff09;与RDD持久化的区别&#xff08;三&#xff09;RDD检查点案例演示 三、共享变量&#…

mysql数据库出现Too many connections以及磁盘满了的查看方式

Too many connections问题 这问题是数据库连接数太多了导致的&#xff0c; 两个排查方向 1、当用户数量大的时候 先查看最大连接数show variables like ‘%max_connections%’; 这里的最大连接数就是2000&#xff0c;够用了&#xff0c;一般500-1000就够了&#xff0c;内存多…

【干货分享】3D模型可视化、格式转换引擎和Parasolid如何集成?

​今天分享一个示例项目&#xff0c;该示例项目使用HOOPS链轮将HOOPS Exchange和Siemens Parasolid实施到HOOPS Visualize中。 HOOPS中文网http://techsoft3d.evget.com/↓ 点击下方视频查看详情 ↓ HOOPS Visualize - Exchange和Parasolid集成视频 正如您在上面的视频中看到…

小白必看:零基础入门网络安全

1、什么是网络安全&#xff1f; 官方的回答&#xff1a;指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 具有保密性、完整性、可用性、可控性…

chatgpt赋能python:Python如何分成两栏写入Word文档

Python如何分成两栏写入Word文档 在进行文本排版时&#xff0c;有些时候我们需要将文字分成两栏来排版&#xff0c;这样可以让文章更加美观&#xff0c;易读。 本文将介绍一种使用Python将文本分成两栏写入Word文档的方法。在介绍具体实现方法之前&#xff0c;我们先来了解一…

【SLAM】ROS平台下三种自主探索算法总结

目录 前言 一、frontier_exploration 二、explorate_lite 三、rrt_exploration 总结 前言 探索是指当机器人处于一个完全未知或部分已知环境中&#xff0c;通过一定的方法&#xff0c;在合理的时间内&#xff0c;尽可能多的获得周围环境的完整信息和自身的精确定位&#…

自动化测试支持

自动化测试支持 自动化测试是现代软件开发中不可或缺的一环。它可以帮助开发团队快速、精确地检测软件中的缺陷&#xff0c;提高软件质量和开发效率。 自动化测试可以在代码变更频繁、测试用例数庞大时&#xff0c;显著地减少测试时间和工作量。相对于手动测试&#xff0c;自动…