嵌入式Linux:编译和使用Protobuf库

目录

1、开发环境和工具

2、安装和编译Protobuf、Protobuf-C库

3、编写和编译proto文件

4、修改makefile文件

5、测试示例

6、参考资料


Protobuf(Protocol Buffers)是由 Google 开发的一种轻量级、高效的结构化数据序列化方式,用于在不同应用之间进行数据交换和存储。它可以用于多种编程语言,并支持自动生成代码,使得数据结构定义和序列化/反序列化过程更加简洁和高效。

Protobuf-C 是 Protocol Buffers 的 C 语言实现,它专门针对 C 语言环境进行了优化,提供了类似于官方实现的功能,同时支持与其他语言生成的 Protobuf 数据进行交互。Protobuf-C 生成的库文件可以被 C 语言项目使用,使得在 C 语言环境中进行高效的数据序列化和反序列化成为可能。

Protobuf优点包括:

  • 高效性:protobuf 生成的数据格式通常比 XML 和 JSON 更加紧凑,序列化和反序列化速度更快。
  • 可扩展性:支持向已有消息类型添加新的字段或消息,而不破坏向后兼容性。
  • 语言无关性:protobuf 支持多种编程语言,包括 C++, Java, Python, Go, 和 C# 等。
  • 自动代码生成:通过 .proto 文件定义消息格式后,可以使用编译器自动生成目标语言的代码,简化开发工作。

Protobuf代码仓库:https://github.com/protocolbuffers/protobuf

Protobuf-C代码仓库:https://github.com/protobuf-c/protobuf-c

由于我需要在SoC开发板上使用C语言版的Protobuf库,所以需要使用到Protobuf和Protobuf-C

Protobuf 提供了 Protobuf 工具,用于将 .proto 文件转换为 C 源代码和头文件,而 Protobuf-c 生成了编译所需的动态库。

1、开发环境和工具

硬件环境

台湾联咏NT96570BG

软件环境

Ubuntu 18.04.6

SDK

na51055_linux_sdk-release.tar.gz

交叉编译工具链

nvt-96570-toolchain.tar.gz

Protobuf版本

V3.6.1(SoC需要和上位机通信,保持双方版本一致)

2、安装和编译Protobuf、Protobuf-C库

SoC编译和使用Protobuf库有2种方式:

  • 下载Protobuf、Protobuf-C源码,集成到SoC SDK包中,修改makefile文件和相关配置,每次编译SDK固件时,也会编译和生成Protobuf所需的库和文件。
  • Ubuntu系统下载和编译Protobuf、Protobuf-C源码,将编译好的库和文件拷贝到SoC APP应用工程中,修改makefile文件和相关配置,直接使用。

这里我们使用第二种方式。

1、安装依赖项,指令如下:

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

2、安装Protobuf

下载Protobuf V3.6.1,解压后进入文件夹,指令如下:

cd protobuf
./autogen.sh
./configure
make
sudo make install
sudo ldconfig

含义如下:

  • cd protobuf: 进入名为 protobuf 的目录。
  • ./autogen.sh: 运行 autogen.sh 脚本,用于生成 configure 配置脚本。
  • ./configure: 根据生成的配置脚本,配置编译环境。
  • make: 编译源代码。
  • sudo make install: 安装编译生成的文件到系统中。
  • sudo ldconfig: 更新动态链接库缓存,使得系统能够找到新安装的库文件。

如果不需要使用指定版本的Protobuf,可以使用git指令下载库:

git clone https://github.com/protocolbuffers/protobuf.git

3、安装protobuf-c

protobuf-c不需要指定版本,直接使用git指令下载仓库,指令如下:

git clone https://github.com/protobuf-c/protobuf-c.git
cd protobuf-c
./autogen.sh
./configure --host=arm-linux-gnueabihf CC=/opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-gcc CXX=/opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-g++ --disable-protoc --prefix=$PWD/tmp_out
make
sudo make install

含义如下:

  • cd protobuf-c: 进入名为 protobuf-c 的目录。
  • ./autogen.sh: 运行 autogen.sh 脚本,用于生成 configure 配置脚本。
  • ./configure --host=arm-linux-gnueabihf CC=/opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-gcc CXX=/opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-g++ --disable-protoc --prefix=$PWD/tmp_out: 配置编译环境,指定目标架构为 arm-linux-gnueabihf,并使用指定的交叉编译器进行编译。
  • make: 编译源代码。
  • sudo make install: 安装编译生成的文件到系统中。

重点说一下configure配置编译环境指令:

  • ./configure: 运行配置脚本。
  • --host=arm-linux-gnueabihf: 指定目标系统架构为 arm-linux-gnueabihf,表示编译生成的程序将在 ARM 架构上运行。
  • CC=/opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-gcc: 指定 C 编译器为 /opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-gcc,即指定了交叉编译器。
  • CXX=/opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-g++: 指定 C++ 编译器为 /opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-g++,即指定了交叉编译器。
  • --disable-protoc: 禁用 protoc 工具的构建,这表示只编译动态库,而不会生成 .proto 文件对应的 C 源码和头文件。
  • --prefix=$PWD/tmp_out: 指定安装路径为当前目录下的 tmp_out 目录。

如果不是ARM SoC使用,只是Ubuntu系统使用,配置编译环境就无需指定交叉编译工具链,指令如下:

./configure

Protobuf、Protobuf-C默认安装在/usr/local路径下:

使用指令可以查看Protobuf、Protobuf-C的版本,指令如下:

protoc-c --version

编译Protobuf-c代码时,指定了链接库输出在当前目录下的 tmp_out 目录。将编译输出物都拷贝到SoC APP应用工程中。

3、编写和编译proto文件

1、创建一个proto文件,文件命名为:LM_PCD_LD.proto,定义了一个消息类型:

syntax = "proto3";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}

2、使用 Protobuf 编译器(protoc)生成对应的C代码:

protoc --c_out=. LM_PCD_LD.proto.proto

编译生成:LM_PCD_LD.pb-c.c和LM_PCD_LD.pb-h文件。将文件拷贝到SoC APP应用工程中。

4、修改makefile文件

1、添加头文件路径:

2、添加动态链接库路径:

3、添加代码路径:

4、拷贝动态库到系统库文件下:

5、测试示例

#include <stdio.h>
#include "LM_PCD_LD.pb-c.h"

int main() {
    // 创建并初始化 Person 消息对象
    Person person = PERSON__INIT;
    person.name = "John Doe";
    person.id = 1234;
    person.email = "johndoe@example.com";

    // 序列化消息对象
    size_t packed_size = person__get_packed_size(&person);
    uint8_t buffer[packed_size];
    person__pack(&person, buffer);

    // 反序列化消息对象
    Person *unpacked_person = person__unpack(NULL, packed_size, buffer);

    // 打印反序列化后的消息内容
    printf("Name: %s\n", unpacked_person->name);
    printf("ID: %d\n", unpacked_person->id);
    printf("Email: %s\n", unpacked_person->email);

    // 释放内存
    person__free_unpacked(unpacked_person, NULL);

    return 0;
}

6、参考资料

https://blog.csdn.net/zhengnianli/article/details/110914259

https://blog.csdn.net/zhengnianli/article/details/109523798

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SSM【Spring SpringMVC Mybatis】——Mybatis(二)

如果对一些基础理论感兴趣可以看这一期&#x1f447; SSM【Spring SpringMVC Mybatis】——Mybatis 目录 1、Mybatis中参数传递问题 1.1 单个普通参数 1.2 多个普通参数 1.3 命名参数 1.4 POJO参数 1.5 Map参数 1.6 Collection|List|Array等参数 2、Mybatis参数传递【#与…

单区域OSPF实验

实验目的&#xff1a; 理解OSPF的基本概念。掌握单曲于OSPF的配置掌握OSPF邻居状态的解读掌握通过Cost控制OSPF选路的方法掌握OSPF认证的配置方法 一、基础配置&#xff1a; 搭建实验拓扑图&#xff1b; 配置路由器接口的IP地址以及配置环回地址待后续使用 &#xff08;1&a…

webjars学习

webjars介绍 官网&#xff1a;WebJars - Web Libraries in Jars github: WebJars GitHub 文档&#xff1a;WebJars - Documentation WebJAR 是一个用于管理Web前端依赖的工具。它允许开发者将特定的客户端库&#xff08;如JavaScript、CSS等&#xff09;打包成JAR&#xf…

STL----push,insert,empalce

push_back和emplace_back的区别 #include <iostream> #include <vector>using namespace std; class testDemo { public:testDemo(int n) :num(n) {cout << "构造函数" << endl;}testDemo(const testDemo& other) :num(other.num) {cou…

python的标准数据类型

四、标准数据类型 1、为什么编程语言中要有类型 类型有以下几个重要角色&#xff1a; 对机器而言&#xff0c;类型描述了内存中的电荷是怎么解释的。 对编译器或者解释器而言&#xff0c;类型可以协助确保上面那些电荷、字节在程序的运行中始终如一地被理解。 对程序员而言…

来个大揭秘,有趣的ZIP压缩文件伪加密(附自制演示工具)

网管小贾 / sysadm.cc “太公……太……哎哟……” 员外刚一个转身&#xff0c;与家仆高才撞了个满怀。 员外用手点指&#xff1a;“你你你……你这小厮&#xff0c;跌跌撞撞&#xff0c;成何体统&#xff01;” 高才坐在地上喘气笑脸道&#xff1a;“恭……恭喜……太……太…

使用Pyramid、Mako和PyJade生成 HTML

Pyramid 是一个流行的 Python Web 框架&#xff0c;而 Mako 和 PyJade 是用于模板引擎的工具&#xff0c;它们可以与 Pyramid 配合使用来生成 HTML 内容。但是在实际使用中还是有些差别的&#xff0c;尤其会遇到各种各样的问题&#xff0c;下面我将利用我所学的知识一一为大家解…

03 Linux编程-进程

1、进程的相关概念 1.1 程序与进程 程序是静态的概念&#xff0c;进程是程序的一次运行活动。 1.2 查看系统中有哪些进程 ps #只显示一小部分进程 ps -aux #会打印当前所有进程 ps -aux|grep init #使用grep筛选出只含有init的进程top #运行显示的进程有点类似windows…

张驰咨询:AI与六西格玛——携手共进,非彼此替代

在历史的洪流中&#xff0c;技术与方法的演进如同波澜壮阔的画卷&#xff0c;不断书写着人类文明的篇章。六西格玛&#xff0c;作为一种追求极致品质与效率的方法论&#xff0c;是现代工业文明中的瑰宝。而当我们面对AI&#xff08;人工智能&#xff09;这一新时代的产物时&…

在阿里云服务器上安装MySQL

目录 一、先卸载不需要的环境 1.关闭MySQL服务 2.查看安装包以及卸载安装包 3.依次卸载所有包 4. 获取mysql官⽅yum源 二、安装&#xff08;密钥过期解决方法&#xff09; 三、启动并进入 关于MySQL MySQL是一个广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&…

通过windows远程桌面,远程连接CentOS系统

1.配置阿里云的YUM仓库 1.1 备份当前的YUM仓库配置文件 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup1.2 下载阿里云的CentOS仓库配置文件 对于CentOS 7&#xff1a; sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirr…

十二生肖Midjourney绘画大挑战:释放你的创意火花

随着AI艺术逐渐进入大众视野&#xff0c;使用Midjourney绘制十二生肖不仅能够激发我们的想象力&#xff0c;还能让我们与传统文化进行一场新式的对话。在这里&#xff0c;我们会逐一提供给你创意满满的绘画提示词&#xff0c;让你的作品别具一格。而且&#xff0c;我们还精选了…

【HR】阿里三板斧--20240514

参考https://blog.csdn.net/haydenwang8287/article/details/113541512 头部三板斧 战略能不能落地、文化能不能得到传承、人才能不能得到保障。 头部三板斧适用的核心场景有三个&#xff1a;一是战略不靠谱&#xff1b;二是组织效率低、不聚心&#xff1b;三是人才跟不上。对…

memset函数

让我们先看两个代码 memset(dp, 0x3f, sizeof(dp)); for (int i 0; i < 5; i)cout << dp[i] << " "; memset(dp, 127, sizeof(dp)); for (int i 0; i < 5; i)cout << dp[i] << " "; 代码结果如下&#xff1a; 现在我们来分…

每日一学—K邻算法:在风险传导中的创新应用与实践价值

文章目录 &#x1f4cb; 前言&#x1f3af; K邻算法的实践意义&#x1f3af; 创新应用与案例分析&#x1f525; 参与方式 &#x1f4cb; 前言 在当今工业领域&#xff0c;图思维方式与图数据技术的应用日益广泛&#xff0c;成为图数据探索、挖掘与应用的坚实基础。本文旨在分享…

C++|多态性与虚函数(1)功能绑定|向上转换类型|虚函数

目录 什么是多态性&#xff1f; 概念 分类 向上类型转换 功能的早绑定和晚绑定 绑定 绑定与多态的联系 编译时多态&#xff08;功能的早绑定&#xff09; 运行时多态&#xff08;功能的晚绑定&#xff09; 一般而言 实现功能晚绑定——虚函数 虚函数定义的说明 什么…

Docker 使用 Fedora 镜像

Fedora 在 Docker 中的使用也非常简单&#xff0c;直接使用命令 docker run -it fedora:latest bash 就可以 pull 到本地的容器中并且运行。 C:\Users\yhu>docker run -it fedora:latest bash Unable to find image fedora:latest locally latest: Pulling from library/fed…

项目实施方案:多点异地机动车典型系统试验状态可视监控系统

目录 一、需求分析 1.1项目背景 1.2项目概述 二、系统优势 2.1兼容性能力强 2.2接入协议多样 2.3并发能力强 2.3.1 单平台参数 2.3.2 多平台性能参数 2.4 系统稳定性 三、建设目标 3.1安全性 3.2可扩展性 3.3易用性 3.4兼容性 3.5 响应能力 四、系统整体解决方…

Linux修炼之路之yum和vim编辑器

目录 一&#xff1a;Linux软件包管理器yum 二&#xff1a;vim编辑器 vim的三种模式及互相转换 命令模式 底行模式 三&#xff1a;普通用户的sudo指令(修改信任名单) 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗-----------林辞忧 一&#xff1a…

创建一个Spring Boot项目

文章目录 一、如何创建一个Spring Boot项目1.1 项目创建&#xff1a;专业版 or 社区版 or 网站创建1.2 数据配置1.3 项目启动1.4 代码编写 二、Spring Boot 项目文件介绍三、Web服务器四、根据HTTP状态码解决bug4.1 4044.2 500 五、Spring VS Spring Boot VS Spring Web MVC5.1…