linux环境下c++实现简单的protobuf调用

linux环境下c++实现简单的protobuf调用,第1张

一.安装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 
#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,感兴趣的同学可以自己试着学一下。

刚接触的时候,难免会碰到或多或少的坑,希望我这篇文章可以给同学们带来一点帮助。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/662227.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-18
下一篇 2022-04-18

发表评论

登录后才能评论

评论列表(0条)

保存