参考网址:

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

window下编译并使用google protobuf的更多相关文章

  1. 在Window下编译LibGeotiff(含Libtiff)

    核心提示:1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件. 1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件.Libgeotiff就是一个操作 ...

  2. caffe 在window下编译(windows7, cuda8.0,matlab接口编译)

    1. 环境:Windows7,Cuda8.0,显卡GTX1080,Matlab2016a,VS2013 (ps:老板说服务器要装windows系统,没办法,又要折腾一番,在VS下编译好像在cuda8. ...

  3. window下编译jcef

    自行编译jcef过程中遇到了一些问题,现在记录如下. 参考的主要文章是jcef的官方介绍: https://bitbucket.org/chromiumembedded/java-cef/wiki/B ...

  4. window下编译ffmpeg 比较简单

    网上关于编译ffmpeg的帖子很多,我也尝试了很多次,但是很多都过不了,一部分原因是版本问题,还有就是有的路劲没说的太明白导致的,经过一天的摸索,最终编译好了,下面把编译方式写下来,希望对看到帖子的人 ...

  5. window 下编译cef 内核 加入mp3/mp4 支持

    下载 depot_tools 解压,加入到环境变量 进入cmd(管理员)运行 gclient 获取 python和git,svn,设置python环境变量 创建新文件夹 mkdir chromium ...

  6. window下编译ffmpeg

    网上关于编译ffmpeg的帖子很多,我也尝试了很多次,但是很多都过不了,一部分原因是版本问题,还有就是有的路劲没说的太明白导致的,经过一天的摸索,最终编译好了,下面把编译方式写下来,希望对看到帖子的人 ...

  7. google protobuf学习笔记:windows下环境配置

    欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/45371743 protobuf的使用和原理,请查看:http:/ ...

  8. Window下Latex加速编译方法以及西农毕设论文模板推荐

    近些日子用Latex写了一遍文章,一共有11页,但是在window下编译需要2分多的时间,使用的是xeletex编译器. 经过查找,得到了以下方法: 如果坚持使用windows下的latex,使用以下 ...

  9. [转]linux下编译boost.python

    转自:http://blog.csdn.net/gong_xucheng/article/details/25045407 linux下编译boost.python 最近项目使用c++操作python ...

随机推荐

  1. ios网络知识

    http://www.cocoachina.com/bbs/read.php?tid-31300.html  启蒙内容 http://blog.csdn.net/nono_love_lilith/ar ...

  2. 转载:ORA-01438: 值大于为此列指定的允许精度

    Number的数据声明如下: 表示        作用        说明Number(p, s)        声明一个定点数        p(precision)为精度,s(scale)表示小数 ...

  3. C++的学习资源

    本文总结了几个好的C++网站,以及C++方面的经典书籍.所列书籍或标准可以到这里找找电子版. wikipedia关于C++有关条目,注意看后面“参考文献”和“外部链接”: C++ programmin ...

  4. 页面无法加载main.css

    html应该用append,不是html,会覆盖掉文件

  5. Array.prototype.sort()对数组对象排序的方法

    Array.prototype.sort()方法接受一个参数——Function,Function会提供两个参数,分别是两个进行比较的元素,如果元素是String类型则通过Unicode code进行 ...

  6. python的编码判断_unicode_gbk/gb2312_utf8(附函数)

    python中, 我们平常使用最多的三种编码为 gbk/gb2312,  utf8 ,  unicode. 而python中并没有一个函数来进行 编码的判断.今天,主要对这三种编码进行讨论,并给出区分 ...

  7. throw与throws的区别

    throws语句       throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常.对大多数Exception子类来说,Java   编译器会强迫你声明在一个成员函数中抛出的异常的 ...

  8. ActiveMQ的初夜

    Producer Flow Control mq自己实现了Flow Control(流量控制,默认开启),在mq的版本中,4.x和5.x流量控制实现原理并不相同,前者通过 TCP Flow Contr ...

  9. Json与javaBean之间的转换工具类

    /**  * Json与javaBean之间的转换工具类  *  * {@code 现使用json-lib组件实现  *    需要  *     json-lib-2.4-jdk15.jar  * ...

  10. 因特网服务的类型(协议),目前最流行的类型是 http协议

    在学习超链接中,在HTML上点击QQ图标时会 自动的启动自己本地QQ客户端,其方法是使用了超链协议 一些常用协议如下: file资源是本地计算机上的文件.格式file:/// ftp通过 FTP访问资 ...