当前位置:   article > 正文

protobuf的安装与基础使用_ubuntu protobuf

ubuntu protobuf

前提

先把之前可能有的删掉

sudo rm -rf /usr/bin/protoc /usr/include/google/ /usr/local/bin/protoc /usr/local/include/google/ /usr/local/lib/libproto* && sudo apt autoremove -y
  • 1

安装

  1. 命令安装(版本应该是3.12.4):
sudo apt install protobuf-compiler libprotobuf-dev -y
  • 1
  1. 源码安装(推荐,因为实际项目对版本可能是有精准要求的)
    https://github.com/protocolbuffers/protobuf/releases/download/v21.12/protobuf-cpp-3.21.12.tar.gz
    下载protobuf-cpp-3.21.12.tar.gz拉到ubuntu,此版本之后的版本都比较难装。安装步骤:
sudo apt update && sudo apt install autoconf automake libtool curl make g++ unzip -y
tar xf protobuf-cpp-3.21.12.tar.gz && rm -f protobuf-cpp-3.21.12.tar.gz && cd protobuf-3.21.12/
./autogen.sh   若有configure就不需要这步了
./configure --prefix=/home/gyl/work/1 --enable-static=no  可以指定安装到哪,不指定就是/usr/local, 自己用一般不指定,工程里作为库依赖最好指定得到include、lib
make install -j$(nproc)
cd .. && rm -rf protobuf-3.21.12/ && sudo ldconfig
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

验证:

protoc --version
whereis protoc
  • 1
  • 2

使用

protobuf会把代码翻译成一个类。
vscode安装vscode-proto3插件,即可语法提示。
创建一个test.proto:常用的基本类型:string, int32,int64,uint32,uint64,enum

syntax = "proto3";
import "xx.proto" //引用其他的proto
package space; //命名空间

message address {
   int32 id = 1;
   repeated string name = 2; //repeated可重复赋值,表示动态数组;			   		     
}

message Msg {
	enum Status { //枚举
  	OK = 0;
  	ERROR = 1;
	}
	
    int32  telephone = 1; //不能只写int 
    address ad = 2; //就是其他类对象作为本类成员,嵌套
    Status status = 3; //枚举类型
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

运行,会在当前目录下生成test.pb.h和test.pb.cc

protoc [-I ./] --cpp_out=. test.proto   若proto里import了proto,可能需要-I指定头文件位置  
  • 1

若是安装在项目目录下:

cd bin/ 
./protoc -I . --cpp_out=. ./*.proto
  • 1
  • 2

后续即可使用,以下为test.cpp

#include <iostream>
#include "test.pb.h"
#include <string>
using namespace std;

int main() {
	/* 口诀: 1.看见repeated:就先add申请内存,若能直接赋值,就不要用set
			 2.看见嵌套类就mutable拿地址;
			 3.普通的就set  */
	space::Msg msg; //先创建对象
	msg.set_telephone(123456); //注意: set全小写
	msg.set_status(OK);
	//ad是嵌套类,需要mutable
	auto ad = msg.mutable_ad();
	ad->set_id(1);
	//repeated,就add
	for (int i = 0; i < 10; i++) {
		ad.add_name("zhang san");
	}
	string str = "";
	if (!SerializeToString(&str)) {
		cout << "序列化失败" << endl;
		return 1;
	}
	
	space::Msg m2;
	m2.ParseFromString(str); //string反序列化为对象,赋给msg2
	//ParseFromArray(buf, 1024);从数组中反序列化,因为有时候从string反序列化遇到\0就截断了
	cout << m2.telephone() << " " << m2.status() << " " << m2.ad().id() << " " << endl;
	
	//遍历数组的就是for循环,如:
	auto msg = m2.mutable_msg();
	for (int i = 0; i < msg->ad_size(); i++) {
		//一层一层往下
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

编译:

g++ test.cpp test.pb.cc -I. -lprotobuf
  • 1

运行:

./a.out
  • 1

视频资料:

https://www.bilibili.com/video/BV1Ze41197vD?p=6&vd_source=f247ffd7af459a07780fbaa4b5e830d9

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号