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.gz
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protoc-3.6.1-linux-x86_64.zip

git 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 -j8
make 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

      更多protobuf的简介、语法、使用、实现原理请移步。https://blog.csdn.net/asmartkiller/article/details/89454276

posted @ 2020-09-26 10:26  jest549  阅读(2092)  评论(0编辑  收藏  举报