zoukankan      html  css  js  c++  java
  • window下编译并使用google protobuf

    参考网址:

    http://my.oschina.net/chenleijava/blog/261263

    http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/

    http://blog.csdn.net/yi_ya/article/details/40404231

    http://blog.csdn.net/yi_ya/article/details/40404059

    http://blog.csdn.net/chenkjiang/article/details/12569835

    一 准备工具

    1 vs2012 update4

    2 google protobuf_2.6.1(https://github.com/google/protobuf)

    注意:

    1 下载google protobuf不要从下载页面上选择 ”download zip” , 个人感觉这个应该是下载当前最新的代码, 而最新的代码可能有bug, 建议从页面上方的 ”release”链接页面选择一个进行下载. 3.0.0-alpha-3及以下的版本与最新的版本编译的时候有些许不同, 下面会一一介绍.

    二 编译

    1 version <=2.6.1

    将protobuf-2.6.1.zip解压缩, 然后在vsprojects文件夹下有一个protobuf.sln文件, 打开它, 由于这个文件是vs2012之前的版本创建的, 所以会有解决方案升级的提示, 按照提示进行操作, 完成后, 编译解决方案的debug版跟release版, 在相应的文件里会生成一些lib跟exe文件,在这里只用得到后面3个文件libprotobuf.lib, libprotoc.lib, protoc.exe(默认编译成静态链接库, 如果想要编译成动态链接库,参见vsprojects目录下的readme.txt文件)

    2 最新版本

    这个解决方案需要用cmake自己生成.

    首先, 下载cmake(http://www.cmake.org/download/), 解压缩, 并把bin目录添加到path环境变量中方便使用.

    然后, 按照cmake/README.md里面的提示, 创建解决方案,

    $ cd path/to/protobuf/cmake

    $ mkdir build

    $ cd build

    $ cmake -G "Visual Studio 9 2008" ..

    注意: 最后一步要根据自己装的vs版本进行设置, 我的应该设置成 “Visual Studio  11 2012”

    三 生成自己的message结构文件

    在protoc.exe 所在的文件夹内编写一个proto文件, 规则如下

    <<Google protobuf proto文件编写规则>>

    测试内容如下

     package lm;

     message helloworld

     {

        required int32     id = 1;  // ID

        required string    str = 2;  // str

        optional int32     opt = 3;  //optional field

     }

    然后在当前目录的cmd窗口下使用命令”protoc -I=./ --cpp_out=./ ./lm.proto” 生成对应的pb.cc, pb.h文件

    四 测试程序

    1 vs创建一个新工程,

    2 在当前项目的属性窗口内设置相关项目

                (1)包含目录: 添加protobuf头文件目录(src目录)

                (2)库目录: libprotobuf.lib, libprotoc.lib 所在的目录

                (3)连接器→输入→附加依赖项: libprotobuf.lib, libprotoc.lib

    3 将之前产生的两个文件添加到工程里面

    注意: 如果创建解决方案的时候使用了预编译头文件, 需要在pb.cc文件的非注释的第一行添加 #include "stdafx.h"

    4 将google/protobuf/repeated_filed.h里面的

    std::copy(from, from + array_size, to); 改成

    std::copy(from, from + array_size,stdext::checked_array_iterator<Element*>(to,array_size));

    因为从vs2012开始, 微软把使用不安全函数的地方标记为err, 之前的版本是warning

    5 编写测试代码

    int main(int argc, char* argv[])

    {

       lm::helloworld msg1;

       msg1.set_id(101);

      msg1.set_str(string("asdfsd"));

      msg1.set_opt(4234);

      string tempstr = msg1.SerializeAsString();

      lm::helloworld msg2;

      msg2.ParseFromString(tempstr);

      cout<< msg2.id()<<endl;

      cout<< msg2.str()<<endl;

      cout<< msg2.opt()<<endl;

      return 0;

    }

    6 如果是使用dll方式调用, 要在测试程序里面添加#define PROTOBUF_USE_DLLS

  • 相关阅读:
    B/S学习总结
    鶴山 李正浩 博士(探访墓所)
    毕业工作五年的总结和感悟(上)
    NSURLConnection经常使用的代理方法
    14.2 事务的ACID属性
    Search a 2D Matrix -- LeetCode
    ios开发之-继承的实现运用
    【Android】读取sdcard上的图片
    BZOJ 2820 YY的GCD 莫比乌斯反演
    linux写环境变量对字符转义
  • 原文地址:https://www.cnblogs.com/talenth/p/5820039.html
Copyright © 2011-2022 走看看