什么是protobuf-c

之前的文章:Protobuf:一种更小、更快、更高效的协议详细介绍了protobuf及protobuf-c。这里再简单提一下:

Protocol Buffers,是Google公司开发的一种数据格式,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。protobuf支持一些主流的语言,唯独没有支持C,所以诞生了第三方的protobuf-c。

之前文章介绍了protobuf、protobuf-c在PC平台上的安装及使用,本篇笔记我们来把它用在我们的嵌入式ARM平台。

交叉编译protobuf-c

之前的文章中我们已经把protobuf、protobuf-c安装在我们的PC环境中了:

我们简单回顾一下我们上一篇文章的大致内容:

从中我们知道,这里的protobuf的主要作用是生成了protoc工具,而protoc工具的作用是把.proto文件生成对应的C源、头文件,这个过程是与平台无关的,所以这里我们可以接着用。而protobuf-c生成了编译需要用到的动态库,此处我们需要编译ARM架构的动态库。即我们本篇笔记需要做的事情是:

(1)交叉编译protobuf-c

首先在protobuf-c目录下使用make clean命令清除我们之前编译得到的东西:

输入如下命令生成交叉编译的Makefile文件:

./configure --host=arm-linux-gnueabihf CC=/home/book/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-gcc CXX=/home/book/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-g++ --disable-protoc --prefix=$PWD/tmp

这个命令似乎很长,但并不难,只是加了几个配置参数。这些配置参数怎么看?我们可以输入./configure --help命令来查看支持的配置:

下面我们依次来分析上面那个很长的命令:

  • --host=arm-linux-gnueabihf:表明了我们最终可执行文件运行的环境。
  • CC=/home/book/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-gcc:这是指定我们的交叉编译工具arm-linux-gnueabihf-gcc,这里直接给出绝对路径。
  • CXX=/home/book/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-g++:这是指定我们的交叉编译工具arm-linux-gnueabihf-g++,这里直接给出绝对路径。
  • --disable-protoc:不使用protoc,前面我们也说了protoc工具把.proto文件生成对应的C源、头文件的过程是与平台无关的,所以这里不需要使用,除非我们想在我们的开发板上使用protoc,但这反而增加麻烦,不推荐直接在开发板上用。
  • --prefix=$PWD/tmp:指定安装的路径。表明安装路径在当前路径下的tmp文件夹中。

执行完这个命令之后就得到了交叉编译的Makefile文件,然后依次输入如下命令进行编译、安装:

make
make install

此时就在当前目录的tmp文件夹下生成了arm版本的相关库文件:

其中我们比较重要的就是libprotobuf-c.so这个动态库了,我们可以使用file或者readelf工具查看其是不是arm格式的:

很显然,这就是我们ARM平台的动态库。

下面开始我们的demo演示:

(2)protobuf-c实例演示

我们自定义一个.proto来创建我们的协议数据,然后使用protoc-c工具编译生成C代码,有两个文件:一个头文件、一个源文件。

例如我们创建一个student.proto文件:

syntax = "proto2";message Student
{required string name    = 1;required uint32 num     = 2;required uint32 c_score = 3;
}

使用protoc-c工具工具编译student.proto文件:

protoc --c_out=. student.proto

编写我们的student.c测试demo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "student.pb-c.h"int main(void)
{Student pack_stu = {0};uint8_t buffer[512] = {0};Student *unpack_stu = NULL;size_t len = 0;student__init(&pack_stu);/* 组包 */pack_stu.name = "ZhengN";pack_stu.num = 88;pack_stu.c_score = 90;len = student__pack(&pack_stu, buffer);printf("len = %ldn",len);/* 解包 */unpack_stu = student__unpack(NULL, len, buffer);printf("unpack_stu.name = %sn", unpack_stu->name);printf("unpack_stu.num = %dn", unpack_stu->num);printf("unpack_stu.c_score = %dn", unpack_stu->c_score);student__free_unpacked(unpack_stu, NULL);return 0;
}

demo很简单,组包就是构造一个协议数据结构体,调用pack组包接口往buffer中扔数据;解包正好是反过来,从buffer中拿数据放到结构体里。

此时我们工程的文件有:

交叉编译:

arm-linux-gnueabihf-gcc student.c student.pb-c.c -o student -I /home/book/git_clone/protobuf-c/tmp/include -L /home/book/git_clone/protobuf-c/tmp/lib -lprotobuf-c

这个命令似乎也很长,其实也很简单:

  • arm-linux-gnueabihf-gcc:交叉编译器。
  • student.c student.pb-c.c:输入的源文件。
  • student:生成的可执行文件。
  • -I /home/book/git_clone/protobuf-c/tmp/include:指定头文件路径。
  • -L /home/book/git_clone/protobuf-c/tmp/lib:指定库路径。
  • -lprotobuf-c:链接动态库libprotobuf-c.so。

这里需要重点提的就是我们可以把我们上面编译得到的tmp/include里的文件复制到我们交叉编译器头文件搜索路径下、把tmp/lib里的文件复制到交叉编译器库文件搜索路径下,这样我们就不需要指定这么长的一串路径了。

但是这里我为了保持我的交叉编译器的一个原始性,我就不往里加东西了。关于这些链接、动态库更详细的内容可以阅读往期文章:静态链接与动态链接

编译没问题的话就可以生成我们的可执行文件student:

同样的,我们可以看一下student可执行文件的运行环境:

可见,是可运行在我们的arm开发板的。

下面把student拷贝到我们的开发板上运行,我这里用的是韦东山老师的IMX6ULL开发板。

运行出现如下错误:

这是因为不能找到共享库文件libprotobuf-c.so1,加载失败,这个问题我们已经在静态链接与动态链接一文中做了详细解释。

解决方法有两种:第一种就是把这个库文件拷贝至系统库默认搜索路径下;第一种就是把当前路径增加为动态库的搜索路径。

这里我们选择第二种方法:我们把libprotobuf-c.so、libprotobuf-c.so1也传到板子上,放在student同目录下。然后输入如下命令把当前路径增加为动态库的搜索路径:

export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH

然后运行:

运行成功!

以上就是咱们介绍的protobuf-c在嵌入式Linux平台上的使用(如果是正在学单片机的朋友,也可以尝试着移植使用。),如有错误,欢迎指出,谢谢。另外,

按照以上两篇文章的步骤,大概率是可以成功的,关键是有耐心。

心得分享:在Linux的学习中,很多时候会被开发环境阻碍我们。常常按照别人的方法、步骤来做,却做不出来,很容易心态蹦,这都是很正常的。因为环境不同,有时候还需要各种依赖。但我们要有足够的耐心,见招拆招!

。如果文章对你有帮助,麻烦帮忙转发,谢谢大家。

linux eclipse c++ 如何生成arm可执行文件_干货 | protobuf-c之嵌入式平台使用相关推荐

  1. linux系统中自动生成snap文件_在Linux操作系统下自动生成Makefile的方法

    在Linux操作系统下进行开发,编写Makefile似乎是不可缺少的事情.但是对于一个比较大的工程,编写一个符合规范的Makefile并非易事.而且由于Makefile的各种显式,隐式规则,加之平时并 ...

  2. cass生成曲线要素_干货在线 | CASS入门指南——道路断面计算土方

    CASS操作指南--道路断面计算土方法 小伙伴们赶紧学起来! 道路类的土方工程,主要用CASS的断面法土方计算之道路断面来计算.整个计算过程主要分为以下四步: 菜单截图 第一步:绘制道路中心线 道路的 ...

  3. cadence自动生成铺铜_干货 | 国内铜湿法冶金工艺现状分析

    更多.更及时的交易信息,干货内容,请关注易矿网 来源 | 网络 编辑 | 易矿资讯,转载请注明出处 1.国内外铜湿法冶金技术发展现状 自1968年以来,世界上已设计.建设并运转了约50家浸出-溶剂萃取 ...

  4. 软件生成问候图片_软件 | 珍藏级推荐!全平台使用!!!

    爱上黑科技,探索科技与生活的完美 ID:Black-keji 作者 | 夜白 来源 | 爱上黑科技 昨日回顾 昨天分享了一款适用于Windows电脑系统的QQ对话需要生成器,无论是撩妹子,还是问候兄弟 ...

  5. python大数据论坛_干货 | Python+大数据计算平台,PyODPS架构手把手教你搭建

    数据分析和机器学习 大数据基本都是建立在Hadoop系统的生态上的,其实一个Java的环境.很多人喜欢用Python和R来进行数据分析,但是这往往对应一些小数据的问题,或者本地数据处理的问题.如何将二 ...

  6. 基于bboss开发平台eclipse开发工程生成工具介绍

    为什么80%的码农都做不了架构师?>>>    基于bboss开发平台eclipse开发工程生成工具介绍 一.工具简介   bboss开发平台发布出两个资源包:  war部署包  数 ...

  7. linux eclipse go插件,Eclipse 安装Go插件 (Ubuntu)

    下载go1.4.2 for linux: http://golangtc.com/download得到一个tar.gz的文件然后一路执行 #解压go到默认的安装目录 sudo tar -C /usr/ ...

  8. windows文本转语音 通过java 调用python 生成exe可执行文件一条龙

    我已记不清 我失败过多少次 ,找过多少资料 ,但是功夫不负有心人 ,还是成功了. 所有资料和需要的语音模块的资料以放置在文章末尾, 有些是引用别人的博客的部分内容, 原文是在有道云笔记,所以没有图 . ...

  9. 从.NET Core 3.1项目生成本地可执行文件

    目录 简介:托管代码的编译? 工作原理:原理 应用领域 样例程序 1.检查Visual Studio安装的组件 2.添加具有ILCompiler的NuGet存储库 3.将依赖项添加到您的项目中 4.为 ...

最新文章

  1. ionic开发ios app
  2. python 动态相册_Python编程:制作电子相册
  3. [C++] - 中的复制初始化(copy initialization)
  4. java以32位运行,强制java applet以32位而不是64位JRE运行
  5. Python - 浅谈Python的编译与反编译
  6. python操作docx入门教程
  7. 在U盘上安装ChromiumOS
  8. excel中查找两列数据中的重复数据
  9. wps图表横纵坐标怎么设置_wps怎么切换横纵坐标/excel图表怎么切换横纵坐标
  10. sws_kp操作(selenium webdriver+python)
  11. 开源源码商城系统盘点
  12. 论异步编程的正确姿势:十个接口的活现在只需要一个接口就能搞定!
  13. 2022年东南大学计算机考研复试时间是什么时候
  14. Android 热修复 Tinker接入及源码浅析
  15. 一个屌丝程序猿的人生(一百一十)
  16. 【Linux工具】GIT+Gollum在Ubuntu下搭建本地WIKI编辑系统
  17. 2017找工作总结——不打无准备的仗
  18. 通达信主力加仓指标 疯牛有理加仓爆发选股指标
  19. 如何使用L298N电机驱动模块
  20. php网站目录结构图,thinkphp项目目录结构详解

热门文章

  1. 刘宏伟计算机组成,哈工大组成原理和数据结构 ppt 计算机组成原理刘宏伟 版本一 第18讲...
  2. 安装rpm包完成却报错(桌面软件类安装包),可以在usr/share/applications目录下找到图标打开
  3. outlook不能保存密码_教大家轻松保存Outlook当中的附件到Onedrive文件夹上
  4. 百度地图添加自定义shp图层_GIS当中使用uDig打开shp图层,并查看数据结果
  5. 剑指 Offer 55 - I. 二叉树的深度
  6. 中文信息处理(四)—— 神经网络基础
  7. CBNetV2论文的译读笔记
  8. 《深度学习笔记》——防止梯度消失的学习笔记
  9. 如何设置Eclipse新建项目的默认编码方式
  10. 【转】VO BO PO 介绍