Protobuf C/C++实战笔记(1)
前言:
Protobuf作为数据交换格式, 被很多人喜欢. 数据压缩比高, 向后兼容性强, 性能优异, 而且对平台中性, 支持多语言(C/C++, JAVA, Python). 优点太多, 实在不胜枚举(居家旅行, 杀人放火必备良药, oh yeah! ^_^).
本篇文章着重记录Linux下对C/C++版Protobuf的编译/链接和API使用.
Protobuf下载和安装
让我们使用protobuf 2.4.1作为样例来展示.
社区url: http://code.google.com/p/protobuf/
下载链接: http://protobuf.googlecode.com/files/protobuf-2.4.1.tar.gz
以下是相关的命令和操作
1). 下载和解压
wget http://protobuf.googlecode.com/files/protobuf-2.4.1.tar.gz
tar -jxvf protobuf-2.4.1.tar.gz
2). 编译和安装
./configure --disable-shared --prefix=/path/to
make && make install
3). 目录结构
tree -L 2 # 两层的目录结构(bin/inculde/lib), 如下所示:

评注: bin/protoc 是pb生成工具, include, lib则是对应的头文件和相应的静态/动态库
实战演示
让我们来编辑一下msg.proto文件
message msg_t {
required int32 id = 1;
}
评注: 简单定义了msg_t类
借助protoc来生成相应语言版本的序列/反序列代码
protoc --cpp_out=./ msg.proto
评注: --cpp_out指定了c/c++版本代码的输出路径
最终生成 msg.pb.cc msg.pb.h 两文件
编写如下测试代码:
#include "msg.pb.h" #include <stdio.h>
#include <assert.h> int main() { char buf[1024] = {'\0'};
int buf_len = 0; msg_t msg1;
msg1.set_id(1001); // *) serialize phrase => object to byte array
msg1.SerializeToArray(buf, sizeof(buf));
buf_len = msg1.ByteSize(); msg_t msg2;
// *) deserialize phrase => byte array to object
msg2.ParseFromArray(buf, buf_len); assert(msg1.id() == msg2.id()); return 0; }
进行编译并运行
g++ -o app app.cpp msg.pb.cc -I/path/to/protobuf/include -L/path/to/protobuf/lib -lprotobuf -lpthread
./app
评注: /path/to为具体protobuf的安装目录
链接方式
静态链接还是动态链接? 这是个问题!
在指定的protobuf库路径中, 如果存在动态连接库, 则编译的程序优先选择动态链接, 否则则采用静态链接的方式.
让我们用图来对比说明
动态链接方式
在protobuf的lib目录中, 若存在动态连接库(so文件)

则编译后的app可执行程序
使用ldd app分析, 存在如下依赖项

评注: 红线区域标明了引用了动态连接库libprotobuf.so.7
直接执行二进制app文件, 遇到如下错误
./app: error while loading shared libraries: libprotobuf.so.7: cannot open shared object file: No such file or directory
显然这边需要设定LD_LIBRARY_PATH变量
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/path/to/protobuf/lib
评注: /path/to/protobuf/lib为实际的protobuf安装路径
静态链接方式
简单的在lib目录移除所有动态连接库(so)文件,

然后进行编译, 使用ldd分析

直接执行app就可以了
总结:
这边主要讲述了protobuf的编译/安装, 以及小demo编写, 重要的讲述了静态链接和动态链接的区别. 网上资料多以动态链接居多, 但实际上静态链接的方式的需要更直接些.
Protobuf C/C++实战笔记(1)的更多相关文章
- mysql颠覆实战笔记(五)--商品系统设计(二):定时更新商品总点击量
继续回到沈老师的MYSQL颠覆实战,首先回顾下上一节课的内容,请大家会看下上节课写的存储过程. 打开prod_clicklog表, 我们只要把日期(不含时分秒)的部分存在数据库中, 如果同一日期有相同 ...
- mysql颠覆实战笔记(四)--商品系统设计(一):商品主表设计
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- mysql颠覆实战笔记(一)--设计一个项目需求,灌入一万数据先
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- mysql颠覆实战笔记(七)--白话理解事务
今天我们学习web开发级mysql颠覆实战课程第9课没MYSQL事务(一):白话理解事务.前面有两节课第7讲:商品系统设计(四):商品属性设计之自定义属性,第8讲:商品系统设计(五):一维属性的商品价 ...
- mysql颠覆实战笔记(六)--商品系统设计(三):商品属性设计之固定属性
今天我们来讲一下商品属性 我们知道,不同类别的商品属性是不同的. 我们先建一个表prod_class_attr:
- mysql颠覆实战笔记(三)-- 用户登录(二):保存用户操作日志的方法
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- mysql颠覆实战笔记(二)-- 用户登录(一):唯一索引的妙用
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- Unity3D项目实战笔记(10):Unity3D编译IPA的PostEvents–节约时间利器
最近,SDK支付等接入差不多了,就从Unity3D生成IPA (企业版License), 然,需要手动执行的PostEvents竟然多大10项+, 这些我默默的承受了1周时间,每次约浪费20分钟-额外 ...
- Unity3D项目实战笔记(5):延时功能的几种实现
我所做过的系统,分单机版系统(2005年).CS系统(2010年).实时系统(2015年),各个系统均有“延时”功能:定时调度的: 本博客说的是实时系统中的延时功能(基于Unity3D游戏引擎). 在 ...
随机推荐
- 解决visualsvn监听ip 错误的问题
系统重启+休眠之类的,弄几次,莫名其妙的svn就连接不上了, 有时候启动不起,有时候是启动连接不上,发现监听的ip错了 TCP [::]:443 [::]:0 ...
- codeigniter在nginx 下支持pathinfo和去除index.php的方法
as今天准备把网站搬迁到nginx上发现codeigniter框架在nginx上不能使用,后来发现是nginx不支持pathinfo,下面介绍怎么在nginx下开启pathinfo 开始pathinf ...
- 读者写者问题继 读写锁SRWLock
在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一 ...
- ScrollView中嵌入ListView,GridView冲突的解决(让ListView全显示出来)
ScrollView中嵌入原生ListView或GridView,会出现ListView,GridView显示不全的问题. 解决方法:重新构造一个ListView或GridView,重写OnMeasu ...
- 支持多人协作的在线免费作图工具:ProcessOn
之前朋友给我推荐一款作图工具ProcessOn,出于好奇我就研究了一下它,今天我就给大家简单介绍一下这款免费的在线作图工具:ProcessOn 首先使用ProcessOn我们需要有一个帐号,这样每次操 ...
- 【转】linux /centos 中OpenSSL升级方法详解
相关软件下载地址 Apache:http://httpd.apache.org/ Nginx:http://nginx.org/en/download.html OpenSSL:http://www. ...
- JS小问题总结
1. 超链接中href=#与href=javascript:void(0) 的区别 #包含了一个位置信息.默认的锚是#top 也就是网页的上端:而javascript:void(0) 仅仅表示一 ...
- IBM RSA 的语言设置
右键 IBM Rational software Architect for websphere software 快捷方式 ----> 打开文件位置 在 eclipse.ini 文件中添加参数 ...
- vs2012 断点不能调试
调试ASP.NET时发现,设置的断点被视而不见 提示错误 debugging information for ‘iisexpress.exe’cannot be found or does not m ...
- 关于wait和notify的用法
通常,多线程之间需要协调工作.例如,浏览器的一个显示图片的线程displayThread想要执行显示图片的任务,必须等待下载线程 downloadThread将该图片下载完毕.如果图片还没有下载完,d ...