当前位置:   article > 正文

protobuf 安装 简单实例 linux_linux 系统安装protoc教程

linux 系统安装protoc教程

1. 下载安装包

官网下载:https://github.com/google/protobuf

https://github.com/google/protobuf/releases

本人安装版本 protobuf-all-3.6.1.tar.gz
  • 1
  • 2
  • 3
  • 4
  • 5

2. 安装过程

2.1 解压

tar zxvf protobuf-all-3.6.0.tar.gz
  • 1

2.2 编译

cd protobuf-3.6.1/
./configure --prefix=/usr/local/protobuf(你的安装路径)
make
make check
make install
  • 1
  • 2
  • 3
  • 4
  • 5

2.3 配置protobuf命令,更改环境变量:

vim /etc/profile
  • 1

在文件的末尾添加如下的两行:

export PATH=$PATH:/usr/local/protobuf/bin/
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
  • 1
  • 2

更改完成之后,执行如下命令立即执行:

source /etc/profile
  • 1

这一步是必须的,如果少了这一步,会出现找不到protoc的命令错误。

2.4 配置动态链接库

vim /etc/ld.so.conf
  • 1

在文件中添加

/usr/local/protobuf/lib(注意: 在新行处添加)
  • 1

更改完成之后,执行如下命令立即执行:

sudo ldconfig
  • 1

测试:

protoc --verison
  • 1

在这里插入图片描述
看到对应版本信息,说明protobuf 安装成功

================================
编写简单例子

新建person.proto,内容如下

syntax="proto2"
package test;
 
message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

编译,生成C++代码

$ protoc ./person.proto --cpp_out=./
  • 1

新建write_person.cpp 文件,代码如下

#include <iostream>
#include <fstream>
#include "person.pb.h"
 
using namespace test;
int main(){
	Person p;
	p.set_name("test");
	p.set_id(1);
	p.set_email("a.iabc.com");
	
	std::string str;
	p.SerializeToString(&str);
	std::cout<<str<<std::endl;  

	Person p1;
	p1.ParseFromString(str);
	std::cout<<"name:"<<p1.name()<<" email:"<<p1.email()<<std::endl;
  return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

编译

g++ write_person.cpp person.pb.cc -g -o write_person -I/usr/local/protobuf/include -L/usr/local/protobuf/lib -lprotoc -lprotobuf -lpthread -std=c++11
  • 1

例子2
新建 people.proto

syntax="proto2";
message People{  
    required string name = 1;  
    required int32 age = 2;  
    optional string email = 3;  
    enum PhoneType{   
        MOBILE = 1;  
        HOME = 2;  
        WORK = 3;  
    }  
    message Phone{  
        required int32 id = 1;  
        optional PhoneType type = 2 [default = HOME];  
    }  
    repeated string phoneNum = 4;  
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

生成cpp 文件

protoc people.proto --cpp_out=./
  • 1

新建write_file.cpp 文件

#include<iostream>
#include "people.pb.h"
#include<fstream>
#include<string>

using namespace std;

int main()
{
	string buffer;
	People people;
	people.set_name("chemical");
	people.set_email("eiie@qq.com");
	people.set_age(29);
	people.add_phonenum("abc");
	people.add_phonenum("def");
	fstream output("myfile",ios::out|ios::binary);
	people.SerializeToString(&buffer);
	output.write(buffer.c_str(),buffer.size());
	
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

编译 write_file.cpp 文件

 g++ write_file.cpp people.pb.cc -g -o write_file -I/usr/local/protobuf/include -L/usr/local/protobuf/lib -lprotoc -lprotobuf -lpthread -std=c++11
  • 1

新建读文件 read_file.cpp

#include <iostream>  
#include "people.pb.h"  
#include <fstream>  
#include <string>  
  
using namespace std;  
  
int main(){  
    People *people = new People;  
    char buffer[BUFSIZ];  
    fstream input("myfile",ios::in|ios::binary);  
    input.read(buffer,sizeof(People));  
    people->ParseFromString(buffer);  
    cout << people->name() << people->phonenum(0) << endl;  
    return 0;  
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

编译读文件
g++ read_file.cpp people.pb.cc -g -o read_file -I/usr/local/protobuf/include -L/usr/local/protobuf/lib -lprotoc -lprotobuf -lpthread -std=c++11

运行 ./read_file,输出
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/901806
推荐阅读
相关标签
  

闽ICP备14008679号