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
window下编译并使用google protobuf的更多相关文章
- 在Window下编译LibGeotiff(含Libtiff)
核心提示:1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件. 1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件.Libgeotiff就是一个操作 ...
- caffe 在window下编译(windows7, cuda8.0,matlab接口编译)
1. 环境:Windows7,Cuda8.0,显卡GTX1080,Matlab2016a,VS2013 (ps:老板说服务器要装windows系统,没办法,又要折腾一番,在VS下编译好像在cuda8. ...
- window下编译jcef
自行编译jcef过程中遇到了一些问题,现在记录如下. 参考的主要文章是jcef的官方介绍: https://bitbucket.org/chromiumembedded/java-cef/wiki/B ...
- window下编译ffmpeg 比较简单
网上关于编译ffmpeg的帖子很多,我也尝试了很多次,但是很多都过不了,一部分原因是版本问题,还有就是有的路劲没说的太明白导致的,经过一天的摸索,最终编译好了,下面把编译方式写下来,希望对看到帖子的人 ...
- window 下编译cef 内核 加入mp3/mp4 支持
下载 depot_tools 解压,加入到环境变量 进入cmd(管理员)运行 gclient 获取 python和git,svn,设置python环境变量 创建新文件夹 mkdir chromium ...
- window下编译ffmpeg
网上关于编译ffmpeg的帖子很多,我也尝试了很多次,但是很多都过不了,一部分原因是版本问题,还有就是有的路劲没说的太明白导致的,经过一天的摸索,最终编译好了,下面把编译方式写下来,希望对看到帖子的人 ...
- google protobuf学习笔记:windows下环境配置
欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/45371743 protobuf的使用和原理,请查看:http:/ ...
- Window下Latex加速编译方法以及西农毕设论文模板推荐
近些日子用Latex写了一遍文章,一共有11页,但是在window下编译需要2分多的时间,使用的是xeletex编译器. 经过查找,得到了以下方法: 如果坚持使用windows下的latex,使用以下 ...
- [转]linux下编译boost.python
转自:http://blog.csdn.net/gong_xucheng/article/details/25045407 linux下编译boost.python 最近项目使用c++操作python ...
随机推荐
- Unity3d游戏场景优化杂谈(2)
动态实时灯光相比静态灯光,非常耗费资源.所以除了能动的角色和物体(比如可以被打的到处乱飞的油桶)静态的地形和建筑,通通使用Lightmap. 强大的Unity内置了一个强大的光照图烘焙工具Beast, ...
- MySQL开启general_log跟踪sql执行记录
# 设置general log保存路径 # 注意在Linux中只能设置到 /tmp 或 /var 文件夹下,设置其他路径出错 # 需要root用户才有访问此文件的权限 mysql>set glo ...
- Sql/Plus连接Oracle时候出现sql*net not properly installed 解决办法
在PLSQL Developer选择Tools > Preferences > options > 下的如图所示:"Oracle Home" and " ...
- springMVC 返回json 忽略类中属性的注解
该注解使用在 类名,接口头上 @JsonIgnoreProperties(value={"comid"}) //希望动态过滤掉的属性 该注解使用在get方法头上 @JsonIgno ...
- 【Summary】ANSYS TRANSIENT ANALYSIS
1.4. Damping: https://www.sharcnet.ca/Software/Ansys/15.0.7/en-us/help/ans_str/Hlp_G_STR1D.html 8.7. ...
- 简易c语言文法
<程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...
- 移动端 touch 事件的originalEvent
对于移动端的触摸事件,我们通过touchstart.touchmove.touchend实现,PC端一般使用mousedown.mousemove.mouseup实现. 我们获取事件坐标,原生js获取 ...
- new 与 malloc 的区别
1, 申请内存所在的位置 new 操作符从自由存储区上为对象动态分配内存空间,而 malloc 函数从堆上动态分配内存.自由存储区是C++基于 new 操作符的一个抽象概念,而堆是操作系统中的术语,是 ...
- [课程设计]Scrum团队分工及明确任务1.0 ----多鱼点餐
[课程设计]Scrum团队分工及明确任务1.0 ----多鱼点餐 一.开发背景 多鱼点餐系统是一套比较系统化的针对餐厅点餐服务的产品,从顾客进入餐厅点餐到用餐结束再到最后的结账买单,需要全面的.高效的 ...
- delegate用法
一般来说 delegate 可以申明一个delegate类型 比如 public delegate funa(object b) 然后使用的时候申明 funa 作为类型 new funa(回调函数 ...