protobuf c++ 笔记

protobuf的github 源码地址为 https://github.com/google/protobuf

本次使用的环境为ubuntu,参照官方教程

1. 编译源码

sudo apt-get install autoconf automake libtool curl #安装工具
git clone https://github.com/google/protobuf #下载源码

进入源码目录,打开autogen.sh脚本,找到下面这行代码,注释掉改行。(因为google被墙,会连接超时)

 curl $curlopts -O https://googlemock.googlecode.com/files/gmock-1.7.0.zip

手动下载gmock-1.7.0.zip文件,放到当前目录,然后继续执行以下命令

./autogen.sh
./configure
make
make check
sudo make install
sudo ldconfig # refresh shared library cache.

2.  proto文件

//person.proto
message Person{
 required string name = 1;
 required uint32 age = 2;
 optional string country = 3;
}

3. 使用protobuf compiler 编译proto文件

protoc --cpp_out=./ person.proto 

指定编译出来的.h和.cc文件放在当前目录

4. main函数

#include <iostream>
#include <fstream>
#include "person.pb.h"

using namespace std;

int main()
{
	GOOGLE_PROTOBUF_VERIFY_VERSION;
	Person p;
	p.set_name("Andy");
	p.set_age(40);
	p.set_country("China");

	{
		cout<<"Save Data"<<endl;
		fstream output("data",ios::out|ios::trunc | ios::binary);
		if(!p.SerializeToOstream(&output)){
			cerr << "Failed to save"<<endl;
			return -1;
		}else{
			cout<<"Save OK"<<endl;
		}
	}

	{
		cout<<"Read Data"<<endl;
		Person p1;
		fstream input("data",ios::in | ios::binary);
		if(!p1.ParseFromIstream(&input)){
			cerr<<"Failed to read"<<endl;
			return -1;
		}

		cout<<"name:"<<p1.name()<<endl;
		cout<<"age:"<<p1.age()<<endl;
		cout<<"country:"<<p1.country()<<endl;

	}

	return 0;
}

 

5. makefile

All: person.pb.cc main.cpp
 pkg-config --cflags protobuf # fails if protobuf is not installed
 g++ person.pb.cc main.cpp -I. -I../protobuf-master/src -o Demo `pkg-config --cflags --libs protobuf`

6. 编译运行

make
./Demo

作者:JarvisChu
原文链接:protobuf c++ 笔记
版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

发表评论