• Google proto buffer的安装/使用


    protobuf安装/使用
    原本是要在官网上下载的:
    http://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz
    可惜已被墙,幸好有好心人提供了以下地址:
    http://pan.baidu.com/s/1pJlZubT

    为了说明安装过程中文件的作用,我就指定目录安装了:

    ./configure --prefix=/usr/local/protobuf/
    make
    make check
    make install

    当然,安装前需要确保自己安装了gcc,g++,automake等,就不多说了。

    安装完成之后,大概生成了这样一个目录结构

    |-- bin
    | `-- protoc
    |-- include
    | `-- google
    | `-- protobuf
    | |-- compiler
    | | |-- code_generator.h
    | | |-- command_line_interface.h
    | | |-- cpp
    | | | `-- cpp_generator.h
    | | |-- importer.h
    | | |-- java
    | | | `-- java_generator.h
    | | |-- parser.h
    | | |-- plugin.h
    | | |-- plugin.pb.h
    | | |-- plugin.proto
    | | `-- python
    | | `-- python_generator.h
    | |-- descriptor.h
    | |-- descriptor.pb.h
    | |-- descriptor.proto
    | |-- descriptor_database.h
    | |-- dynamic_message.h
    | |-- extension_set.h
    | |-- generated_enum_reflection.h
    | |-- generated_message_reflection.h
    | |-- generated_message_util.h
    | |-- io
    | | |-- coded_stream.h
    | | |-- gzip_stream.h
    | | |-- printer.h
    | | |-- tokenizer.h
    | | |-- zero_copy_stream.h
    | | |-- zero_copy_stream_impl.h
    | | `-- zero_copy_stream_impl_lite.h
    | |-- message.h
    | |-- message_lite.h
    | |-- reflection_ops.h
    | |-- repeated_field.h
    | |-- service.h
    | |-- stubs
    | | |-- atomicops.h
    | | |-- atomicops_internals_arm_gcc.h
    | | |-- atomicops_internals_arm_qnx.h
    | | |-- atomicops_internals_atomicword_compat.h
    | | |-- atomicops_internals_macosx.h
    | | |-- atomicops_internals_mips_gcc.h
    | | |-- atomicops_internals_pnacl.h
    | | |-- atomicops_internals_x86_gcc.h
    | | |-- atomicops_internals_x86_msvc.h
    | | |-- common.h
    | | |-- once.h
    | | |-- platform_macros.h
    | | |-- template_util.h
    | | `-- type_traits.h
    | |-- text_format.h
    | |-- unknown_field_set.h
    | |-- wire_format.h
    | |-- wire_format_lite.h
    | `-- wire_format_lite_inl.h
    `-- lib
    |-- libprotobuf-lite.a
    |-- libprotobuf-lite.la
    |-- libprotobuf-lite.so -> libprotobuf-lite.so.8.0.0
    |-- libprotobuf-lite.so.8 -> libprotobuf-lite.so.8.0.0
    |-- libprotobuf-lite.so.8.0.0
    |-- libprotobuf.a
    |-- libprotobuf.la
    |-- libprotobuf.so -> libprotobuf.so.8.0.0
    |-- libprotobuf.so.8 -> libprotobuf.so.8.0.0
    |-- libprotobuf.so.8.0.0
    |-- libprotoc.a
    |-- libprotoc.la
    |-- libprotoc.so -> libprotoc.so.8.0.0
    |-- libprotoc.so.8 -> libprotoc.so.8.0.0
    |-- libprotoc.so.8.0.0
    `-- pkgconfig
    |-- protobuf-lite.pc
    `-- protobuf.pc
    

      

    然后我们先贴代码:

    lm.helloworld.proto

    package lm;
    message helloworld
    {
            required int32 id = 1;
            required string str = 2;
            optional int32 opt = 3;
    }

    write.cc

    #include<iostream>
    #include<fstream>
    #include<stdio.h>
    #include "lm.helloworld.pb.h"
    
    using namespace std;
    using namespace lm;
    
    int main()
    {
            lm::helloworld msg1;
            msg1.set_id(101);
            msg1.set_str("hello");
    
            fstream output("./msg.pb", ios::out | ios::trunc | ios::binary);
    
            if(!msg1.SerializeToOstream(&output))
            {
                    cerr << "Failed to write msg."<<endl;
                    return -1;
            }
            return 0;
    }

    read.cc

    #include<iostream>
    #include<fstream>
    #include<stdio.h>
    #include "lm.helloworld.pb.h"
    
    using namespace std;
    using namespace lm;
    
    void listmsg(const lm::helloworld &msg)
    {
            cout<<msg.id()<<endl;
            cout<<msg.str()<<endl;
    }
    
    int main()
    {
            lm::helloworld msg1;
    
            fstream input("./msg.pb", ios::in | ios::binary);
    
            if(!msg1.ParseFromIstream(&input))
            {
                    cerr << "Failed to write msg."<<endl;
                    return -1;
            }
            listmsg(msg1);
            return 0;
    }

    首先需要生成一个类似于lm.helloworld.proto的接口类的接口文件

    /usr/local/protobuf/bin/protoc -I ./ --cpp_out=./ lm.helloworld.proto

    我们可以看见生成了如下两个文件,这是编译的时候需要的

    lm.helloworld.pb.cc
    lm.helloworld.pb.h

    而/usr/local/protobuf/bin/protoc正是protobuff用来生成此文件的程序;

    然后我们就可以编译了

    g++ -I /usr/local/protobuf/include/ lm.helloworld.pb.cc read.cc -o read `pkg-config --cflags --libs /usr/local/protobuf/lib/pkgconfig/protobuf.pc`
    g++ -I /usr/local/protobuf/include/ lm.helloworld.pb.cc write.cc -o write `pkg-config --cflags --libs /usr/local/protobuf/lib/pkgconfig/protobuf.pc`

    分别生成的write和read的可执行程序,就是我们使用protobuff的例子,先执行./write,后执行./read,就会看见结果:

    [root@MYCR Protobuf]# ./read 
    101
    hello

  • 相关阅读:
    为自己的开篇
    软考程序员笔记
    centos php7 安装mysqli扩展心得
    php判断访问协议是否是https
    go语言新建多维map集合
    获取contenteditable区域光标所在位置信息
    ckeditor中 config.js等通过ckeditor.js引入文件手动修改方法
    Vue使用——v-for循环里面使用v-if判断显示数据
    数据库关联字段设置
    Spring Jpa 自动建表——时间字段设置
  • 原文地址:https://www.cnblogs.com/bugutian/p/5008156.html
Copyright © 2020-2023  润新知