zoukankan      html  css  js  c++  java
  • 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] = {''};
      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编写, 重要的讲述了静态链接和动态链接的区别. 网上资料多以动态链接居多, 但实际上静态链接的方式的需要更直接些.

  • 相关阅读:
    面向对象的三个特征:封装(抽象)、继承、多态
    java中流程控制有4种循环,各自的适用场景
    break 和 continue
    基础知识点总结及示例
    Java程序的运行过程,以及Java为什么能够跨平台
    JDK,JRE,JVM的区别与联系?
    jsp(二)
    JSP
    过滤器
    Servlet监听器(二)
  • 原文地址:https://www.cnblogs.com/mumuxinfei/p/3994896.html
Copyright © 2011-2022 走看看