ubunbu系统下google protobuf的安装

说明: 使用protobuf时需要安装两部分:

第一部分为*.proto文件的编译器,它负责把定义的*.proto文件生成对应的c++类的.h和.cpp文件;

第二部分是protobuf的c++动态库(由protobuf的源码编译生成),该部分在生成链接生成可执行文件时需要使用到。

1. 安装编译google protobuf源文件时需要的依赖文件

sudo apt-get install autoconf automake libtool curl make g++ unzip

2. 下载google protobuf 的c++对应的源码,并解压至当前目录中

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.2/protobuf-cpp-3.11.2.tar.gz
tar -xf protobuf-cpp-3.11.2.tar.gz

3. 进入解压后的目录,并安装

./configure
make
make check
sudo make install
sudo make ldconfig

google protobuf的使用

1. 新建一个表示电话薄的addressbook.proto文件

touch addressbook.proto
echo 'syntax = "proto2";
package tutorial; message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3; enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
} message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
} repeated PhoneNumber phones = 4;
} message Addressbook {
repeated Person people = 1;
}
' > addressbook.proto

2. 使用porotc编译器生成address.proto对应的*.cpp和*.h文件,运行以下命令生成了addressbook.pb.cc和addressbook.pb.h文件。

protoc addressbook.proto

3. 创建两个读与写电话薄的*.cpp文件,使用google protobuf完成写与读的功能。

  • 写文件:
touch write_message.cpp
echo '#include <iostream>
#include <fstream>
#include <string>
#include "addressbook.pb.h" using namespace std; void PromptForAddress(tutorial::Person* person) {
cout << "Enter person ID number: ";
int id;
cin >> id;
person->set_id(id);
cin.ignore(256, '\n'); cout << "Enter name: ";
getline(cin, *person->mutable_name()); cout << "Enter email address (blank for none): ";
string email;
getline(cin, email);
if (!email.empty())
person->set_email(email); while (true) {
cout << "Enter a phone number (or leave blank for finish): ";
string number;
getline(cin, number);
if (number.empty())
break; tutorial::Person::PhoneNumber* phone_number = person->add_phones();
phone_number->set_number(number); cout << "Is this a mobile, home, or work phone? ";
string type;
getline(cin, type);
if (type == "mobile")
phone_number->set_type(tutorial::Person::MOBILE);
else if (type == "home")
phone_number->set_type(tutorial::Person::HOME);
else if (type == "work")
phone_number->set_type(tutorial::Person::WORK);
else
cout << "Unkown phone type. Using default. " << endl;
}
} int main(int argc, char* argv[]) {
GOOGLE_PROTOBUF_VERIFY_VERSION; if (argc != 2) {
cerr << "Usage: " << argv[0] << "ADDRESS_BOOK_FILE " << endl;
return -1;
} tutorial::Addressbook address_book; fstream input(argv[1], ios::in | ios::binary);
if (!input)
cout << argv[1] << ": File not found. Creating a new file. " << endl;
else if (!address_book.ParseFromIstream(&input)) {
cerr << "Failed to parse address book. " << endl;
return -1;
} PromptForAddress(address_book.add_people()); fstream output(argv[1], ios::out | ios::trunc | ios::binary);
if (!address_book.SerializeToOstream(&output)) {
cerr << "Failed to write address book. " << endl;
return -1;
} google::protobuf::ShutdownProtobufLibrary();
return 0;
}
' > write_message.cpp
  • 读文件:
touch read_message.cpp
echo '#include <iostream>
#include <fstream>
#include <string>
#include "addressbook.pb.h" using namespace std; void ListPeople(const tutorial::Addressbook& address_book) {
for (int i = 0; i < address_book.people_size(); ++i) {
const tutorial::Person& person = address_book.people(i); cout << "Person ID: " << person.id() << endl;
cout << "Name: " << person.name() << endl;
if (person.has_email()) {
cout << " E-mail address: " << person.email() << endl;
} for (int j = 0; j < person.phones_size(); ++j) {
const tutorial::Person::PhoneNumber& phone_number = person.phones(j);
switch (phone_number.type()) {
case tutorial::Person::MOBILE:
cout << " Mobile phone#: ";
break;
case tutorial::Person::HOME:
cout << " Home phone#: ";
break;
case tutorial::Person::WORK:
cout << " Work phone#: ";
break;
}
cout << phone_number.number() << endl;
}
}
} int main(int argc, char** argv) {
GOOGLE_PROTOBUF_VERIFY_VERSION;
if (argc != 2) {
cerr << "Usage: " << argv[0] << "ADDRESS_BOOK_FILE " << endl;
return -1;
} tutorial::Addressbook address_book;
fstream input(argv[1], ios::in | ios::binary);
if (!address_book.ParseFromIstream(&input)) {
cerr << "Failed to parse address book. " << endl;
return -1;
} ListPeople(address_book); google::protobuf::ShutdownProtobufLibrary();
return 0;
}
' > read_message.cpp

4. 分别编译write_message.cpp文件和read_message.cpp文件(其中pkg-config命令可以输出关于protobuf动态库相关的编译时的参数)

g++ write_message.cpp addressbook.pb.cc -o write.out $(pkg-config --cflags --libs protobuf)
g++ read_message.cpp addressbook.pb.cc -o read.out $(pkg-config --cflags --libs protobuf)

5. 分别运行write.out和read.out文件进行写与读操作

./write.out result.protobuf
./read.out result.protobuf

google protocol 入门 demo的更多相关文章

  1. Google Protocol Buffers 快速入门(带生成C#源码的方法)

    Google Protocol Buffers是google出品的一个协议生成工具,特点就是跨平台,效率高,速度快,对我们自己的程序定义和使用私有协议很有帮助. Protocol Buffers入门: ...

  2. Google Protocol Buffers 入门

    Google Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储等领域的 ...

  3. Google Protocol Buffer入门

    简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...

  4. Google Protocol Buffers介绍

    简要介绍和总结protobuf的一些关键点,从我之前做的ppt里摘录而成,希望能节省protobuf初学者的入门时间.这是一个简单的Demo. Protobuf 简介 Protobuf全称Google ...

  5. Google Protocol Buffer 的使用和原理[转]

    本文转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构 ...

  6. 基于springboot构建dubbo的入门demo

    之前记录了构建dubbo入门demo所需的环境以及基于普通maven项目构建dubbo的入门案例,今天记录在这些的基础上基于springboot来构建dubbo的入门demo:众所周知,springb ...

  7. canal入门Demo

    关于canal具体的原理,以及应用场景,可以参考开发文档:https://github.com/alibaba/canal 下面给出canal的入门Demo (一)部署canal服务器 可以参考官方文 ...

  8. Google protocol buffer的配置和使用(Linux&&Windows)

    最近自己的服务器做到序列化这一步了,在网上看了下,序列化的工具有boost 和google的protocol buffer, protocol buffer的效率和使用程度更高效一些,就自己琢磨下把他 ...

  9. Google Protocol Buffer 的使用和原理(无论对存储还是数据交换,都是个挺有用的东西,有9张图做说明,十分清楚)

    感觉Google Protocol Buffer无论对存储还是数据交换,都是个挺有用的东西,这里记录下,以后应该用得着.下文转自: http://www.ibm.com/developerworks/ ...

随机推荐

  1. Azure Media Services -可提供视频点播(VOD)

    ​Azure Media Services 提供直播/VOD点播相关的功能. •提供编码和打包以适用于各种设备播放视频(IOS/Android/web等). •向大量在线观众流式传输实时直播,例如活动 ...

  2. 如何使用maven开启一个webapp项目

    1.使用maven创建好一个webapp项目 2.pom.xml: 第一步:修改版本 <properties> <project.build.sourceEncoding>UT ...

  3. 【macOS使用技巧】使用空格键快速预览文件内容

    Quickview 是mac系统上一个强大的预览功能, 可以预览 mp4 mov等音频文件, 当然图片.文本.也都可以进行预览. 在系统中如果你希望快速浏览一下文件而不想打开的文件的话只要选择文件然后 ...

  4. 堆优化 dijkstra 简介

    dijkstra 前言 原本我真的不会什么 dijkstra 只用那已死的 spfa ,还有各种玄学优化,可是,我不能相信一个已死的算法,就像我不能相信自己. ps : 虽然他已经活了 序 我站在镜子 ...

  5. Gird(1)

    目录 网格布局 grid(1) 实现方式 对容器设置的属性 行高与列宽的设置 单元格的间距 内容的位置 表格在容器的位置 兼容问题 网格布局 grid(1) 实现方式 display:grid 也可成 ...

  6. PostgreSQL内核学习笔记四(SQL引擎)

    PostgreSQL实现了SQL Standard2011的大部分内容,SQL处理是数据库中非常复杂的一部分内容. 本文简要介绍了SQL处理的相关内容. 简要介绍 SQL文的处理分为以下几个部分: P ...

  7. 木兰国产编程语言 Mulan--附带下载地址

    我国自主研发的 编程语言:木兰. 中国新闻网 : http://www.cas.cn/cm/202001/t20200116_4731821.shtml 说明介绍 百度一番后,发现没有下载地址,没有官 ...

  8. C# 数组冒泡排序复习

    using System; namespace runoob { class MyClass { static void Main(string[] args) { MyClass1 myClass ...

  9. CSS背景说明及连写

    一.CSS背景说明 CSS 可以添加背景颜色和背景图片,以及来进行图片设置. 1.1 背景图片(image) background-image 属性允许指定一个图片展示在背景中(只有CSS3才可以多背 ...

  10. 用R实现范式编程

    面向函数范式编程(Functional programming) 模拟简单的随机过程 模拟一个简单的随机过程:从N~(0,1)标准正态分布中产生100个随机值,反复5次得到一个list,再以每个lis ...