protobuf的是google的一个强大的网络传输协议。
下面一个简单的安装使用。
1:下载:
protobuf-2.5.0.tar.gz
protobuf-2.5.0-win.zip
protobuf-2.5.0,是protobuf的源文件,protobuf-2.5.0-win.zip里面是一个protoc.exe应用文件,用于给传输类编译成h和cc文件。
如解压protobuf-2.5.0-win.zip的目录:
2:添加编译环境变量,用于编译成头文件和CC文件。
【我的电脑】->【属性】->【高级系统设置】->【环境变量】->【系统变量】->【新建】变量名:PROTOBUF_HOME 变量值:E:\work_uu\protobuf\protoc-2.5.0-win32(上面protobuf-2.5.0-win.zip的解压目录)
在系统变量中找到Path的选项:在其中添加 ;%PROTOBUF_HOME%; 注意前后都有分号(;)
测试:打开cmd,输入protoc -h 正确有相应的提示,表示成功
3:编译
(1):打开protobuf-2.5.0的解压文件的vsprojects中工程文件protobuf.sln
编译:libprotobuf 有错误:
1>..\src\google\protobuf\io\zero_copy_stream_impl_lite.cc(121): error C3861: “min”: 找不到标识符
1>..\src\google\protobuf\io\zero_copy_stream_impl_lite.cc(168): error C3861: “max”: 找不到标识符
1>..\src\google\protobuf\io\zero_copy_stream_impl_lite.cc(195): error C3861: “min”: 找不到标识符
则在文件中添加:
#include
(2):修改vs2013的编译强制copy检查,若不修改,编译对象文件的时候,会报_Copy_Imp的错误
修改libprotobuf工程下的repeated_field.h文件。
修改如下:
namespace internal {
template
void ElementCopier
Element to[], const Element from[], int array_size) {
std::copy(from, from + array_size, stdext::checked_array_iterator
//std::copy(from, from + array_size, to);
}
最后一个一个编译工程,生成libprotobuf.lib,libprotobuf-lite.lib,libprotoc.lib,lite-test.exe,protoc.exe,test_plugin.exe,tests.exe
4.添加测试工程文件:
新建控制台文件testprotobuf.sln工程
新建protobuf_lib文件夹,把上面编译的lib文件copy到这个文件下。
新建protobuf_src文件夹,把protobuf-2.5.0的源文件下的src文件夹下的所有文件copy到此文件夹下。
新建Person.proto文件,
内容如下:
package Test;
message Person
{
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
输入命令:
protoc -I=E:\work\testProtobuf --cpp_out=E:\work\testProtobuf E:\work\testProtobuf\Person.proto
把相应的目录换成.proto文件所在的目录即可
完成后会生成两个文件:
Person.pb.h
Person.pb.cc
然后添加到工程中。
5.添加源文件的头文件。
添加lib,【属性】-【链接器】-【输入】-【附加依赖项】把上面的三个lib添加进来
在包含lib所在的库文件:【属性】-【链接器】-【常规】-【附加库本目录】:$(SolutionDir)\protobuf_lib
添加测试源码:
#include "stdafx.h"
#include "..\Person.pb.h"
#include
#include
int _tmain(int argc, _TCHAR* argv[])
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
Test::Person person;
person.set_id(123);
person.set_name("abc");
person.set_email("[email protected]");
std::cout << "Before:" << std::endl;
std::cout << "ID:" << person.id() << std::endl;
std::cout << "name:" << person.name() << std::endl;
std::cout << "email:" << person.email() << std::endl;
std::string str;
person.SerializeToString(&str);
Test::Person person2;
person2.ParseFromString(str);
std::cout << "After:" << std::endl;
std::cout << "ID:" << person2.id() << std::endl;
std::cout << "Name:" << person2.name() << std::endl;
std::cout << "Email:" << person2.email() << std::endl;
system("pause");
return 0;
}