protobuf+vs2013编译安装

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的解压目录)

protobuf+vs2013编译安装_第1张图片

在系统变量中找到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::operator()(
    Element to[], const Element from[], int array_size) {
std::copy(from, from + array_size, stdext::checked_array_iterator(to, array_size));
  //std::copy(from, from + array_size, to);
}


最后一个一个编译工程,生成libprotobuf.lib,libprotobuf-lite.lib,libprotoc.lib,lite-test.exe,protoc.exe,test_plugin.exe,tests.exe


注意:编译的debug版本的lib,要对应工程的bebug版,要是工程师release,最好对已release版本的lib


4.添加测试工程文件:


新建控制台文件testprotobuf.sln工程

protobuf+vs2013编译安装_第2张图片


新建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;
}

打开cmd

输入命令:

protoc -I=E:\work\testProtobuf --cpp_out=E:\work\testProtobuf E:\work\testProtobuf\Person.proto

把相应的目录换成.proto文件所在的目录即可

完成后会生成两个文件:

Person.pb.h

Person.pb.cc


然后添加到工程中。


5.添加源文件的头文件。

protobuf+vs2013编译安装_第3张图片


添加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;
}

结果如下:

protobuf+vs2013编译安装_第4张图片




你可能感兴趣的:(C++)