一.安装protobuf
1.安装必要的工具
yum install -y autoconf
yum install -y automake
yum install -y libtool
yum install -y curl
yum install -y make
yum install -y g++
yum install -y unzip
2.将protobuf压缩包下载在/usr/local/目录下
cd /usr/local/
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.7.1/protobuf-cpp-3.7.1.tar.gz
3.开始解压并安装
//解压
tar -xzvf protobuf-cpp-3.7.1.tar.gz
//进入解压后的目录
cd protobuf-3.7.1
//依次执行命令,完成安装
./autogen.sh
./configure
make
make check
sudo make install
sudo ldconfig
//删除压缩包
rm -f ../protobuf-cpp-3.7.1.tar.gz
4.测试是否安装成功
执行protoc --version,看一下是否能打印出版本号
二.用c++实现简单的例子
创建一个proto目录,用于保存.proto文件
mkdir proto
cd proto
创建一个User.proto文件
syntax = "proto2";
message User
{
optional uint64 id = 1;
optional string nickName = 2;
}
写一个编译脚本gen.sh
proto_dir=./
proto_src=./src
target=mode
#删掉生成文件,保证每次执行都是最新的
rm -rf src
#创建一个目录,用来保存pb.h pb.cc pb.o 让代码看起来更干净一些
mkdir src
#以c++的格式生成pb文件,*.pb.h *.pb.cc
protoc -I=$proto_dir --cpp_out=$proto_src $proto_dir/*.proto
执行脚本 sh gen.sh
打开src目录 cd /src
再到proto同目录级创建一个test目录
mkdir test
cd test
编写一个main.cpp
#include <iostream>
#include "../proto/src/User.pb.h"
int main(int argc, char** argv)
{
//创建一个User结构
User user1;
user1.set_id(100);
user1.set_nickname("小明");
//将结构序列化成string
std::string str = "";
user1.SerializeToString(&str);
std::cout << str << std::endl;
//创建一个空结构,将user1的序列化结构反序列化给usr2实现值的传递
User user2;
user2.ParseFromString(str);
std::cout << user2.id() << " " << user2.nickname() << std::endl;
return 0;
}
写一个简单的makefile文件
cc=g++
#编译过程
cc_flags=-std=c++11 \
#链接过程,需要注意的是,prototbuf需要将protobuf的动态链接库引入,还需要libpthread.so库
ln_flags=-L/usr/local/lib -lprotobuf \
-lpthread \
#所有的.o文件
obj=main.o \
../proto/src/User.pb.o \
#目标文件
target=process
#依赖关系
$(target) : $(obj)
$(cc) $(ln_flags) $(obj) -o $(target)
%.o : %.cpp
$(cc) $(cc_flags) -c $< -o $@
%.o: %.cc
$(cc) $(cc_flags) -c $< -o $@
clean:
rm -f $(obj) $(target)
写一个简单的run.sh脚本
ulimit -c 100000 #加上这一行有崩溃的时候会产生core文件,感兴趣的可以了解一下
export LD_LIBRARY_PATH=/usr/local/lib/: #需要将protobuf的库引入
./process
执行make命令,产生process可执行文件
运行run.sh脚本 sh run.sh 查看结果
6.总结
小编写这个博客主要是想给刚接触protobuf的同学做一个简单的引导,protobuf运用广泛,目前各大公司的通信协议使用的都是protobuf,感兴趣的同学可以自己试着学一下。刚接触的时候,难免会碰到或多或少的坑,希望我这篇文章可以给同学们带来一点帮助。