【protobuf】protobuf 的安装与使用

protobuf是什么?
protobuf(Protocol Buffer)它是google提供的一个开源库,是一种语言无关、平台无关、扩展性好的用于通信协议、数据存储的结构化数据串行化方法。有如XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。


protobuf-c 是什么?
由于Protocol Buffer原生没有对C的支持,只能使用 protobuf-c 这个第三方库,它提供了支持C语言的API接口。

下面先安装protobuf,然后安装protobuf-c 。

1. 安装protocbuf

1.1 下载源码安装包
https://developers.google.com/protocol-buffers/
【protobuf】protobuf 的安装与使用_第1张图片

【protobuf】protobuf 的安装与使用_第2张图片

在release下可以找到所有的版本,我这里用的是2.4.1版本,复制protobuf-2.4.1.tar.gz的链接然后用wget命令下载。
wget  https://github.com/google/protobuf/releases/download/v2.4.1/protobuf-2.4.1.tar.gz

1.2 解压
tar -zxvf protobuf-2.4.1.tar.gz

1.3 编译/安装
cd protobuf-2.4.1
(可以参考README思路来做。)
./configure
make
make check  (check结果可能会有错误,但不用管她,因为暂时那些功能用不到)
make install
(完了之后会在 /usr/local/bin 目录下生成一个可执行文件 protoc)

1.4 检查安装是否成功
protoc --version
如果成功,则会输出版本号信息。如果有问题,则会输出错误内容。

1.5 错误及解决方法
protoc: error while loading shared libraries: libprotoc.so.8: cannot open shared
错误原因:
protobuf的默认安装路径是/usr/local/lib,而/usr/local/lib 不在Ubuntu体系默认的 LD_LIBRARY_PATH 里,所以就找不到该lib
解决方法:
1). 创建文件 /etc/ld.so.conf.d/libprotobuf.conf,在该文件中输入如下内容:
/usr/local/lib  
2). 执行命令
sudo ldconfig 

这时,再运行protoc --version 就可以正常看到版本号了


2. 安装protobuf-c
(这里使用的是protobuf-c-0.15版本 ,较高版本的安装类似

进入下面的链接
https://code.google.com/p/protobuf-c/
进入Downloads界面
【protobuf】protobuf 的安装与使用_第3张图片
protobuf-c-1.0以下属于较老的版本,下载会有点麻烦,而1.0(含1.0)属于较高的版本,可以直接到GitHub中下载。
我们这里使用protobuf-c-0.15,所以点击 archived here,进入如下界面。
【protobuf】protobuf 的安装与使用_第4张图片
【protobuf】protobuf 的安装与使用_第5张图片
不知怎地,wget无法下载途中的protobuf-c-0.15.tar.gz文件。

怎么办呢,我们可以点击上图中的Export to GitHub,将代码导入到GitHub(当然你得有并登录自己的github账号),不过只有源码,没有release版。我们先wget下载源码,解包。由于是源码,所以没有configure文件,但是可以通过执行autogen.sh来生成configure文件,之后的操作就和安装protobuf类似了,这里就不细说了。
安装完成后会在 /usr/local/bin 目录下便会生成一个可执行文件 protoc-c

在安装完protobuf-c后,我们来检验一下protobuf-c是否安装成功。到  protobuf-c-0.15/src/test 目录下,执行如下命令:
$ protoc-c --c_out=. test.proto
(c_out 标志是用来指定编译后所生成文件的输出路径,这里c_out指定的是当前目录。)
如果在c_out指定目录下能够生成 test.pb-c.c 和 test.pb-c.h 这两个文件则说明安装成功了。


3. protobuf的使用示例
$ touch person.proto
输入如下内容:
message Person {
  required string name = 1;
  required int32 id = 2;
}
编译.proto文件
$ protoc-c --c_out=. person.proto

touch main.c
输入如下代码:
#include 
#include 
#include "person.pb-c.h"

void main()
{
        // 定义一个Person元素,并往其中存入数据
        Person person = PERSON__INIT;
        person.id = 1314;
        person.name = "lily";  // 字符串 lily 位于常量区

        printf("id = %d\n", person.id);
        printf("name = %s\n", person.name);

        // 打包
        int len = person__get_packed_size(&person);
        //printf("len = %d\n", len);
        void *sendpack = malloc(len);
        person__pack(&person, sendpack);
         // sendpack是打好的包,可以通过socket通讯将其发送出去。
        //(这里主要讲protobuf,就不发送了)
 
        // 接收端解包
        Person *recvbuf = person__unpack(NULL, len, sendpack);
        printf("id = %d\n", recvbuf->id);
        printf("name = %s\n", recvbuf->name);
        // 包用完了要释放
        person__free_unpacked(recvbuf, NULL);
        free(sendpack);
}

编译
$ gcc person.pb-c.c main.c -lprotobuf-c

执行 ./a.out,输出结果如下:
id = 1314
name = lily
id = 1314
name = lily

你可能感兴趣的:(开源技术笔记)