参考网址: 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版, 在相应的文件里会生成一些lib跟exe文件,在这里只用得到后面3个文件libprotobuf.lib, libprotoc.lib, protoc.exe(默认编译成静态链接库, 如果想要编译成动态链接库,参见vsprojects目录下的readme.txt文件) 2 最新版本 这个解决方案需要用cmake自己生成. 首先, 下载cmake(http://www./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 |
|
来自: WindySky > 《protobuf3》