vs2012 编译 并使用 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” , 个人感觉这个应该是下载当前最新的代码, 而最新的代码可能有错误, 建议从页面上方的 ”release”链接页面选择一个进行下载. 3.0.0-alpha-3及以下的版本与最新的版本编译的时候有些许不同, 下面会一一介绍.

编译

1 3.0.0-alpha-3版本

protobuf-2.6.1.zip解压缩, 然后在vsprojects文件夹下有一个protobuf.sln文件, 打开它, 由于这个文件是vs2012之前的版本创建的, 所以会有解决方案升级的提示, 按照提示进行操作, 完成后, 编译解决方案的debug版跟release, 在相应的文件里会生成一些libexe文件,在这里只用得到后面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

猜你喜欢

转载自talenth.iteye.com/blog/2230050