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编写, 重要的讲述了静态链接和动态链接的区别. 网上资料多以动态链接居多, 但实际上静态链接的方式的需要更直接些.

时间: 2024-11-11 04:53:46

Protobuf C/C++实战笔记(1)的相关文章

定向爬虫实战笔记

定向爬虫实战笔记 流程图如下: 来自追女神助手(痴汉)v0.1: 1.#-*-coding:utf8-*-2.3.import smtplib4.from email.mime.text import MIMEText5.import requests6.from lxml import etree7.import os8.import time9.import sys10.reload(sys)11.sys.setdefaultencoding('utf-8')12.13.14.15.clas

机器学习实战笔记6(SVM)

鉴于July大哥的SVM三层境界(http://blog.csdn.net/v_july_v/article/details/7624837)已经写得非常好了,这里我就不详细描述,只是阐述简单的几个概念.如果看SVM三层境界有困惑,我也愿意与大家交流,共同进步. 简单概念描述: (1)      支持向量机(SVM, support vectormachine)就是通过最大化支持向量到分类超平面之间的分类间隔.分类超平面就是我们想要得到的决策曲面:支持向量就是离分类超平面最近的点,而间隔即为支持

[ios5 cocos2d游戏开发实战] 笔记3-FileUtils, notificationCenter

FileUtils //文件管理工具 FileUtils::getInstance() std::string getStringFromFile(const std::string& filename);//读取文件中的字符串 Data getDataFromFile(const std::string& filename);//获取文件数据 void setSearchPaths(const std::vector<std::string>& searchPaths

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

最近,SDK支付等接入差不多了,就从Unity3D生成IPA (企业版License), 然,需要手动执行的PostEvents竟然多大10项+, 这些我默默的承受了1周时间,每次约浪费20分钟-额外的. 周末用了2天时间,研究一下官方的例子和雨松的相关博客2篇,总算是搞定了这件事情,开心! 痛苦的前传: Unity3D导出为XCode工程后,有如下任务需要做 Plist 文件中 <key>CFBundleDevelopmentRegion</key> 中文 <string&

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

我所做过的系统,分单机版系统(2005年).CS系统(2010年).实时系统(2015年),各个系统均有“延时”功能:定时调度的: 本博客说的是实时系统中的延时功能(基于Unity3D游戏引擎). 在Unity3D中,新建的脚本会默认继承MonoBehaviour,其中Update函数会被引擎自动调度,如在我的电脑上,Update函数被调用的周期为0.012s. 那么Unity3D中,仅有通过Update函数来实现延时功能吗?  还有无其他的实现呢? 怎么才能让一个界面只显示1秒之后 然后再执行

机器学习实战笔记7(Adaboost)

1:简单概念描述 Adaboost是一种弱学习算法到强学习算法,这里的弱和强学习算法,指的当然都是分类器,首先我们需要简单介绍几个概念. 1:弱学习器:在二分情况下弱分类器的错误率会高于50%.其实任意的分类器都可以做为弱分类器,比如之前介绍的KNN.决策树.Na?ve Bayes.logiostic回归和SVM都可以.这里我们采用的弱分类器是单层决策树,它是一个单节点的决策树.它是adaboost中最流行的弱分类器,当然并非唯一可用的弱分类器.即从特征中选择一个特征来进行分类,该特征能是错误率

企业虚拟化应用实战笔记

将<企业级虚拟机应用实战>这本旧书重新拿出来,把基础概念部分进行了梳理,笔记如下: 1. 企业级虚拟化 1.1 架构分类 寄居架构:安装在另外操作系统上,如vmware workstation 优势:硬件兼容性较强,满足宿主操作系统上的全部硬件能力: 劣势:对宿主操作系统依赖性强 原生架构:hypervisor 直接运行与硬件之上,足够小,如32M等 劣势:HCL(硬件兼容表)支持的硬件才能使用 1.2 企业应用价值 1)服务隔离原则 2)提高硬件资源效率 3)高可用性:虚机具备弹性 ->

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

今天我们来讲一下商品属性 我们知道,不同类别的商品属性是不同的. 我们先建一个表prod_class_attr: 给这个表填入一些数据: 接下来,我们再建一个商品属性对应表 prod_attr 好了,下面我们把新增商品的流程撸一遍: 第一步,往商品主表插入数据 我们来新建一个存储过程 sp_new_prod: BEGIN INSERT INTO prod_main(prod_name,prod_classid) VALUES (_prod_name,_class_id); END 参数:IN _

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

版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸老师署名以及课程来源地址. 这几节课沈老师先带我们说道一下商品表. 固定商品:譬如我们只是卖鞋,那么整个商品的属性基本都是一致的,列如鞋的颜色.尺寸.款式.品牌.价格.这时候我们涉及到的表往往是平面的. 这种涉及方法的特点: 1.纯定制化. 2.开发快,仅仅只要针对某些元素开发. 3.但是扩展性差,一旦我们新