protobuf3移植到arm以及简单使用(C++版本)

1.编译环境准备,在Ubuntu下安装好autoconf、automake、libtool、make、g++、unzip,并准备好交叉工具链。

执行命令:

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

2.下载c++版本的protobuf

网站:https://github.com/protocolbuffers/protobuf/releases

下载protobuf-cpp-[VERSION].tar.gz以及相应版本protoc工具protoc-[VERSION]-linux-x86_64.zip(我的UBuntu是64位的)

可以用浏览器下载、也可以用wget下载,还可以用git clone下载protobuf源码。

wget 下载,例如:wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-cpp-3.6.1.tar.gzwget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protoc-3.6.1-linux-x86_64.zipgit clone下载,例如:
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh

3.交叉编译成库

先解压 tar -xvf protobuf-cpp-3.6.1.tar.gz

进入 protobuf-3.6.1目录,执行命令

./configure --host=arm-linux --prefix=xxx/xxx/protobuf3.6.1-arm CC=xxx/xxx/arm-linux-gcc CXX=xxx/xxx/arm-linux-g++ --with-protoc=../protoc-3.6.1/bin/protoc
看一下自己ubuntu支持最大线程数
cat /proc/cpuinfo | grep "processor" | wc -l
我输出的是8
make -j8make check

解压protoc工具

mkdir protoc-3.6.1 
unzip protoc-3.6.1-linux-x86_64.zip -d protoc-3.6.1

4.简单使用protobuf

(1)编写proto文件MyTest.proto如下:

syntax="proto3";
package MyTest;
message TestMessage{
    uint64 id=1;
    uint32 state=2;
    string name=3}

message AllMessage{
    uint64 all_id=1;
    uint32 all_state=2;
   TestMessage testmsg=3;     
}

在这里插入图片描述
(2)使用解压好的protoc工具生成.cc和.h文件,执行命令

xxx/xxx/protoc -I=./ --cpp_out=xxx/xxx   xxx/xxx/MyTest.proto

-I  Specify the directory in which to search for imports. 
--cpp_out   Generate C++ header and source
xxx/xxx/MyTest.proto   target which will be Generate to   C++ header and source

(3)简单使用protobuf进行序列化与反序列化示例

#include <iostream>
#include "MyTest.pb.h"
int MakeData(char *outPutData)
{
    MyTest::AllMessage allmsg;
    allmsg.set_all_id(123);
    allmsg.set_all_state(234);
    #if 0
    /*不能用静态分配的TestMessage类,需要用new分配*/
    MyTest::TestMessage testmsg;
    testmsg.set_id(345);
    testmsg.set_state(567);
    testmsg.set_name("HelloWorld");
    allmsg.set_allocated_testmsg(&testmsg);
    #endif
    MyTest::TestMessage *testmsg=new MyTest::TestMessage;
    testmsg->set_id(345);
    testmsg->set_state(567);
    testmsg->set_name("HelloWorld");
    allmsg.set_allocated_testmsg(testmsg);
    int len=allmsg.ByteSize();
    if(allmsg.SerializePartialToArray(outPutData,len))
        return len;
    else
        return -1;

}
void DeData(char *inputData,int len)
{
    MyTest::AllMessage allmsg;
    if(allmsg.ParseFromArray(inputData,len))
    {
        std::cout<<"all_id="<<allmsg.all_id()<<std::endl;
        std::cout<<"all_state="<<allmsg.all_state()<<std::endl;
        std::cout<<"testmsg.id="<<allmsg.testmsg().id()<<std::endl;
        std::cout<<"testmsg.state="<<allmsg.testmsg().state()<<std::endl;
        std::cout<<"testmsg.name="<<allmsg.testmsg().name()<<std::endl;
    }
    else
    {
        std::cout<<"parse data is error"<<std::endl;
    }
}
int main()
{
    char buf[1024];
    int len=MakeData(buf);
    if (len>0)
    {
        DeData(buf,len);
    }
    return 0;
}输出:

在这里插入图片描述
源码位置:https://github.com/jest549/LibTransAndUse/tree/master/Protobuf3.6.1/useDemo
https://github.com/549jest/LibTransAndUse/tree/master/Protobuf3.6.1/useDemo
   更多protobuf的简介、语法、使用、实现原理请移步。https://blog.csdn.net/asmartkiller/article/details/89454276

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ protobuf3 是 Google 开发的一种高效的序列化框架,可以将结构化数据序列化为二进制格式,以便于在网络传输或磁盘存储中使用。它的主要特点是高效、可扩展、跨平台,并且支持多种语言的互操作性。使用 protobuf3,可以轻松地在不同的编程语言和操作系统之间传递数据。 在使用 protobuf3 时,需要先定义一个 .proto 文件来描述数据结构和消息格式。然后使用 protobuf 编译器将 .proto 文件编译成对应编程语言的源代码文件,例如 C++。在 C++ 中,可以使用 protobuf3 库提供的 API 来进行序列化和反序列化操作,从而实现数据的传输和存储。 以下是一个简单的示例,展示如何使用 protobuf3C++ 中进行序列化和反序列化操作: ``` // 定义 .proto 文件 message MyMessage { int32 id = 1; string name = 2; } // 使用 protobuf 编译器生成 C++ 代码 protoc --cpp_out=. my_message.proto // 在 C++使用 protobuf3 序列化和反序列化数据 MyMessage message; message.set_id(1); message.set_name("Hello World!"); // 序列化为二进制格式 std::string serialized_data; message.SerializeToString(&serialized_data); // 反序列化为原始数据 MyMessage new_message; new_message.ParseFromString(serialized_data); ``` 以上代码演示了如何使用 protobuf3C++ 中进行序列化和反序列化操作。可以看出,使用 protobuf3 可以方便地实现数据的传输和存储,同时也提高了性能和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值