1. protobuf安装
// 下载 protoBuf: $ git clone https://github.com/protocolbuffers/protobuf.git // 安装依赖库 $ sudo apt-get install autoconf automake libtool curl make g++ unzip libffi-dev -y // 进入目录 $ cd protobuf/ // 自动生成configure配置文件: $ ./autogen.sh // 配置环境: $ ./configure // 编译源代码(要有耐心!): $ make // 安装 $ sudo make install // 刷新共享库 (很重要的一步啊) $ sudo ldconfig // 成功后需要使用命令测试 $ protoc -h
安装完成之后,输入下面指令测试
2. protobuf使用demo
2.1 project.proto
//指定版本 使用protobuf3 syntax = "proto3"; message Account { //账号 uint64 ID = 1; //名字 string name = 2; //密码 string password = 3; }
- message 表示一个消息体, 相当于一个类。
- 每个message中都有对应的变量, 每个变量有个对应的编号, 每个message内不同变量的编号不能重复。
- 新版本的protobuf没有了required, optional等说明关键字, 都默认为optional
所以基本的语法规则跟C++类似。 只不过多了后面变量的编号。
生成代码
protoc --cpp_out=./ project.proto
protoc是工具名, 可以直接运行的命令。
–cpp_out是参数, 指定生成C++代码, =后面指定生成的目录。
project.proto是定义的文件。
一共会生成两个文件。 project.pb.h 和 project.pb.cc
2.2 main.cpp
#include <iostream> #include <string> #include "project.pb.h" int main() { Account account; account.set_id(1000); account.set_name("name"); account.set_password("password"); //序列化 std::string s = account.SerializeAsString(); if(s.size() == 0) { std::cout << "error in SerializeAsString" << std::endl; } Account nAccount; //反序列化 if(nAccount.ParseFromString(s)) { std::cout << nAccount.id() << std::endl; std::cout << nAccount.name() << std::endl; std::cout << nAccount.password() << std::endl; } else { std::cout << "error in ParseFromString" << std::endl; } return 0; }
编译
project.pb.cc也需要编译, 如果是工程中, 可以单独编译, 由于只有一个文件所以就放到一块编译了
g++ project.pb.cc demo.cpp -o test `pkg-config --cflags --libs protobuf` -lpthread
输出:
如果使用这个编译指令:
g++ project.pb.cc demo.cpp -o test -lprotobuf -lpthread -std=c++11
会报undefined reference的错误。
参看链接:
https://zhuanlan.zhihu.com/p/160249058
https://blog.csdn.net/lcuwb/article/details/90705397
https://blog.csdn.net/qinjie6839000/article/details/53573629