在C语言环境下使用google protobuf
本文写给经常使用C编程且不喜欢C++而又要经常使用google protobuf的人。
经常写通讯程序的人对数据进行序列化或者反序列化时,可能经常使用google的protobuf(PB),其优点多多,不用我在这里赘述。
google官方的PB可以跨语言使用,唯独缺了C语言。礼失求诸野,我在网上找到了一个非官方的protobuf-c,其官方网址是http://code.google.com/p/protobuf-c/,令人奇怪的是这么好的东东从2011年下半年后再无更新,令人遗憾。
使用这个工具之前当然是先安装它了。安装它之前请先下载最新版本的protobuf并安装它,然后再安装protobuf-c。
PB的安装过程如下:
1 到PB官方网站 https://code.google.com/p/protobuf/ 下载PB的安装包,如protobuf-2.5.0.tar.gz;
2 用命令tar -zxf protobuf-2.5.0.tar.gz 对压缩包解压;
3 进入解压后的源码目录 cd protobuf-2.5.0;
4 在linux 上以root权限执行下列命令./configure --prefix=/usr/local/protobuf && make && ake check && make install
5 在/etc/profile中添加下列两行:
export PATH=$PATH:/usr/local/protobuf/bin/
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
在你home目录下的~/.bashrc添加下列两行:
export PATH=$PATH:/usr/local/protobuf/bin/
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
6 仍然以root身份打开/etc/ld.so.conf,添加下面一行:
/usr/local/protobuf/lib
7 以root身份执行命令ldconfig。
然后安装PC,安装步骤如下:
1 直接点击这里直接下载我修改过的PC安装包myprotobuf-c-0.15.xz;
2 用命令tar -Jxf myprotobuf-c-0.15.xz对压缩包进行解压;
3 进入源码目录protobuf-c-0.15,在此处可查看change_list.txt文件,里面说明了我对源码的修改之处;
4 在linux以root身份执行安装命令./configure --prefix=/usr/lib64/protobuf_c CXXFLAGS=-I/usr/lib64/protobuf/include LDFLAGS=-L/usr/lib64/protobuf/lib64 && make && make install
5 在/etc/profile和~/.bashrc中修改PATH等变量结果,修改结果如下:
export PATH=/usr/lib64/protobuf/bin:$/usr/lib64/protobuf_c/bin:PATH
export PKG_CONFIG_PATH=usr/lib64/protobuf/lib64/pkgconfig: /usr/lib64/protobuf_c/lib64/pkgconfig
注意这里的结果已经把上面PB的修改结果也包含进去了。
6 仍然以root身份打开/etc/ld.so.conf,添加下面一行:
/usr/lib64/protobuf_c/lib64/
7 以root身份执行命令ldconfig。
安装完成后,可以写代码了。PC编译proto文件的命令格式是protoc-c --c_out=./ test.proto。
大家可以先写几个简单的程序测试下它的有效性,protobuf-c(PC)官方网址http://code.google.com/p/protobuf-c/wiki/Examples 里面就有很多很好的测试用例。
使用过后,可能有的看法有:
1 PC的API太简单了,无法与PB相提并论;
2 proto文件中定义的message被PC转换为源码时,相应的class名称被改变,且函数名称也是不甚明了。
针对第一看法,本文不予讨论,因为本文开头第一段就说明了使用PC的是不喜欢C++的人,PC的API虽简单而这正体现了C的灵活性。
我属于持有第二种看法的人,原PC的class名称和message名称不一致而且不简短,class的函数名称也是不够简洁。原PC遵循New BSD License,所以为了达到目的------我直接把PC的源码修改了。
我往常的惯例,欢迎大家有问题或者疑问随时跟我联系,我的email是alexstocks@foxmail.com。
我的测试用例也一并上传,请点击这里下载。
请大家看看测试用例中的pc_public.h文件,相信大家会体会到宏的好处。
另外,大家仔细看看测试用例的makefile中INC和LIB两个变量的值,大家自己使用我的PC写程序的时候尽量加上这两个变量或者直接参考我的makefile进行修改,以防止自己的程序在编译或链接的时候出问题。
侯捷说过“源码之前,了无密码”,此乃至理名言。本篇blog可以算作是我的测试用例的readme,希望有心人仔细去看我的测试用例。
此毕。
在C语言环境下使用google protobuf的更多相关文章
- oracle多语言环境下to_date时间转换问题
现象:在多语言环境下使用过oracle的同学想必都遇到过这样一个问题, date_v date; date_v := to_date('2010/11/16');--或'2010/11/16' 同一个 ...
- Dynamics CRM2015 非基础语言环境下产品无法新建的问题
该现象出现在2015版本上,之前从没注意过这个问题不知道以前的版本是否存在. 我的安装包的基础语言是中文,第一张图有添加产品的按钮,切换到英文环境下后就没有了,一开始以为是系统做了隐藏处理,但用工具查 ...
- VS下使用Google Protobuf完成SOCKET通信
如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 出处:如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 最近一 ...
- Windows下编译Google.Protobuf在Qt(C++)中使用与Unity3d(C#)交互
1.首先从Github-Protobuf下载代码,本文下载的版本号是3.1.0. 2.仔细查看各个README,有相关的资源下载和编译说明. 3.在一个方便的地方创建一个Install类型的文件夹,放 ...
- windows和linux环境下使用google的glog日志库
一.概述 glog是google推出的一款轻量级c++开源日志框架,源码在github上,目前最新release版本是v0.3.5. githut地址:https://github.com/googl ...
- 如何正确设置 Informix GLS 及 CSDK 语言环境
本文介绍 GLS 相关知识,说明如何正确设置 Informix GLS 语言环境相关变量(DB_LOCALE,CLIENT_LOCALE),保证 Informix 数据库服务器.客户端能正确的支持中文 ...
- Windows环境下google protobuf入门
我使用的是最新版本的protobuf(protobuf-2.6.1),编程工具使用VS2010.简单介绍下google protobuf: google protobuf 主要用于通讯,是google ...
- google protobuf学习笔记:windows下环境配置
欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/45371743 protobuf的使用和原理,请查看:http:/ ...
- .Net环境下调用ProtoBuf
一.什么是ProtoBuf protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.它是一种类似于xml.json等类似作用的交互格式.由于它是一种 ...
随机推荐
- 8021x 获取IP信息失败,请检查锐捷认证客户端当前配置是否符合所在网络的要求,检查完毕后尝试重新认证
早上一起床,登陆锐捷客户端上网,谁知道错问题了.不能联网了,锐捷登陆成功,但是一会儿就提示失败,获取IP信息失败了.下面我描述一下问题原因: 锐捷登陆后有认证提示,和往常正常情况一样的,不过有个小感叹 ...
- MongoDB安装Windows服务
由于官方下载较慢.这里提供一个个人百度共享网盘地址: http://pan.baidu.com/s/1mhHW0nI mongodb-win32-x86_64-3.2.3 使用以下命令将MongoDB ...
- AOJ - 0009 Prime Number (素数筛法) && AOJ - 0005 (求最大公约数和最小公倍数)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34870 求n内的素数个数. /* ********************* ...
- leetcode:Contains Duplicate和Contains Duplicate II
一.Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your fun ...
- POJ 1458 最长公共子序列
子序列就是子序列中的元素是母序列的子集,且子序列中元素的相对顺序和母序列相同. 题目要求便是寻找两个字符串的最长公共子序列. dp[i][j]表示字符串s1左i个字符和s2左j个字符的公共子序列的最大 ...
- UVa 136 Ugly Numbers【优先队列】
题意:给出丑数的定义,不能被除2,3,5以外的素数整除的的数称为丑数. 和杭电的那一题丑数一样--这里学的紫书上的用优先队列来做. 用已知的丑数去生成新的丑数,利用优先队列的能够每次取出当前最小的丑数 ...
- UVa 156 Ananagrams
题意:给出一些单词,在这些单词里面找出不能通过字母重排得到的单词(判断的时候不用管大小写),然后按照字典序输出. 学习的紫书的map= = 将每一个单词标准化 先都转化为小写,再排序(即满足了题目中说 ...
- 一个基于WebGL的仿真3D水池有逼真的水波纹效果
最近在研究WebGL,看到国外很多高手做的很多超炫的3D效果,无比羡慕.忍不住把效果趴下来研究,下面介绍一个逼真的游泳池中浮动小球的效果.效果非常绚丽,功能强大.示例可切换观察水池的视角,不同视角考虑 ...
- mysql里group by按照分组里的内容的排序
得到一张表里按u_id分组,按count(id)排序,每个分组的pub_time最大的哪些记录,只取count(id)最大的4条 select a.u_id,a.name,a.u_name,a.id, ...
- ORA-00257错误
Archiver error,connect internal only,until freed 表示归档日志目录已满,用户不能再连接数据库,现有用户可继续查询数据库,但是不能执行DML语句 插删 ...