前言:
  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)的更多相关文章

  1. mysql颠覆实战笔记(五)--商品系统设计(二):定时更新商品总点击量

    继续回到沈老师的MYSQL颠覆实战,首先回顾下上一节课的内容,请大家会看下上节课写的存储过程. 打开prod_clicklog表, 我们只要把日期(不含时分秒)的部分存在数据库中, 如果同一日期有相同 ...

  2. mysql颠覆实战笔记(四)--商品系统设计(一):商品主表设计

    版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...

  3. mysql颠覆实战笔记(一)--设计一个项目需求,灌入一万数据先

    版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...

  4. mysql颠覆实战笔记(七)--白话理解事务

    今天我们学习web开发级mysql颠覆实战课程第9课没MYSQL事务(一):白话理解事务.前面有两节课第7讲:商品系统设计(四):商品属性设计之自定义属性,第8讲:商品系统设计(五):一维属性的商品价 ...

  5. mysql颠覆实战笔记(六)--商品系统设计(三):商品属性设计之固定属性

    今天我们来讲一下商品属性 我们知道,不同类别的商品属性是不同的. 我们先建一个表prod_class_attr:

  6. mysql颠覆实战笔记(三)-- 用户登录(二):保存用户操作日志的方法

    版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...

  7. mysql颠覆实战笔记(二)-- 用户登录(一):唯一索引的妙用

    版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...

  8. Unity3D项目实战笔记(10):Unity3D编译IPA的PostEvents–节约时间利器

    最近,SDK支付等接入差不多了,就从Unity3D生成IPA (企业版License), 然,需要手动执行的PostEvents竟然多大10项+, 这些我默默的承受了1周时间,每次约浪费20分钟-额外 ...

  9. Unity3D项目实战笔记(5):延时功能的几种实现

    我所做过的系统,分单机版系统(2005年).CS系统(2010年).实时系统(2015年),各个系统均有“延时”功能:定时调度的: 本博客说的是实时系统中的延时功能(基于Unity3D游戏引擎). 在 ...

随机推荐

  1. HDU 3255 扫描线(立方体体积并变形)

    Farming Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  2. JavaScript 自定义事件

    //自定义事件 function Event() { var handles = []; //绑定事件 this.addHandle=function(fn) { handles.push(fn); ...

  3. ios 常用的小框架

    在ios开发中,一些请求 kvc 下拉列表  图片请求等等自己手写代码的话非常麻烦,还容易出现一系列的问题,现在整理了一些常用的一些小框架. 其中MJExtension 和 MJRefresh 这两个 ...

  4. CSU 1111 D(Contest #3)

              有三户人家共拥有一座花园,每户人家的太太均需帮忙整理花园.A 太太工作了5 天,B 太太则工作了4 天,才将花园整理完毕.C 太太因为正身怀六甲无法加入她们的行列,便出了90元.请 ...

  5. Dom事件初步了解

    1.事件流 事件流可以分为两种:事件冒泡和事件捕获 1. 事件冒泡就是从目标元素一直冒泡到根元素html(IE和DOM浏览器都有) 2. 事件捕获就是从根元素到目标元素(DOM浏览器支持) 2.事件处 ...

  6. TrueType, OpenType, PCL和PostScript字体版本nterleaved 2 of 5 Barcode Font Advantage Package

    Interleaved 2 of 5 Barcode Font Advantage Package包含了TrueType, OpenType, PCL和PostScript字体版本. 提供了超过30个 ...

  7. 开始接触BT5-自动登录X界面

    第一种,直接登录root用户的图形界面,不用输入密码 1,安装rungetty 1 # apt-get install rungetty 2,编辑/etc/init/tty1.conf root@bt ...

  8. AFNETWorking3.x实战教程

    上一篇文章介绍了优秀的第三方网络请求框架AFNETWorking2.0,本篇就通过一个实战例子来总结AFNetworking的使用. 本文参考http://www.raywenderlich.com/ ...

  9. ASP.NET是如何在IIS下工作的[转]

    ASP.NET与IIS是紧密联系的,由于IIS6.0与IIS7.0的工作方式的不同,导致ASP.NET的工作原理也发生了相应的变化. IIS6(IIS7的经典模式)与IIS7的集成模式的不同 IIS6 ...

  10. 《Java程序性能优化:让你的Java程序更快、更稳定》

    Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧