protobuf/C++ 安装测试与项目中使用makefile编译

5 篇文章 0 订阅
该博客详细介绍了如何在Ubuntu系统上安装protobuf 3.19.4,并提供了从.proto文件编译消息类型到.pb.h和.pb.cc的步骤。通过一个简单的C++示例展示了如何使用protobuf进行序列化和反序列化操作,包括设置字段值、序列化到字符串、从字符串解析等。此外,还展示了项目的目录结构、Makefile的使用以及编译和清理protobuf文件的shell脚本。
摘要由CSDN通过智能技术生成

安装

# 依赖
sudo apt-get install build-essential
sudo apt install libtool autoconf make  
sudo apt install make-guile
# 安装
cd protobuf-3.19.4
sudo ./autogen.sh
sudo ./configure
sudo make
sudo make check
sudo make install
sudo ldconfig    # refresh shared library cache
# 检验
protoc --version

demo

zcm@vm:~/Documents/protobuf_test$ tree
.
├── pb
│   ├── msg.pb.cc
│   ├── msg.pb.h
│   ├── msg.proto
└── src
    └── test_protobuf.cpp
syntax = "proto3";
package demo;  
  
message People {  
  string name = 1;  
  int32 id = 2;  
  string email = 3; 
 
}  
# 编译出 pb.h pb.cc
protoc --cpp_out=. msg.proto 
// 使用

#include<iostream>
#include"../pb/msg.pb.h"
#include<cstring>
int main()
{
    std::string data;
    demo::People p;
    p.set_name("zhang san");
    p.set_id(101);
    p.set_email("zhang@163.com");
    p.SerializeToString(&data);
    std::cout<<"serialize to string \n"<<"data size:"<<data.size()<<"\n"<<data<<"\n";
    
    std::cout<<"parse from string \n";
    demo::People p1;  
    p1.ParseFromString(data);  
    std::cout << "People: " << std::endl;  
    std::cout << "Name: " << p1.name() << std::endl;  
    std::cout << "ID: " << p1.id() << std::endl;  
    std::cout << "Email: " << p1.email() << std::endl; 
}
// 编译
g++ src/test_protobuf.cpp pb/msg.pb.cc -o test -lprotobuf

运行

zcm@vm:~/Documents/protobuf_test$ ./test 
serialize to string 
data size:32

	zhang sane�zhang@163.com
parse from string 
People: 
Name: zhang san
ID: 101
Email: zhang@163.com

makefile编译

使用了makefile编译整个项目,shell脚本生成与清除pb,未统一

项目结构
zcm@vm:~/Documents/protobuf_test$ tree
.
├── build
│   └── test
├── makefile
├── pb
│   ├── clean.sh
│   ├── create.sh
│   ├── msg.pb.cc
│   ├── msg.pb.h
│   ├── msg.proto
│   ├── people.pb.cc
│   ├── people.pb.h
│   └── people.proto
└── src
    ├── makefile
    └── test_protobuf.cpp
项目总体Makefile
all: 
	cd pb && ./create.sh
	cd src && make
	
clean:
	cd pb && ./clean.sh
	cd src && make clean

pb生成脚本与清除脚本
# create.sh

BASE_DIR=..
SCR_DIR=$BASE_DIR/pb
DES_DIR=$BASE_DIR/pb

protoc --proto_path=$SCR_DIR --cpp_out=$DES_DIR $SCR_DIR/*.proto
# clean.sh

BASE_DIR=..
# SCR_DIR=$BASE_DIR/pb
DES_DIR=$BASE_DIR/pb

rm -f $DES_DIR/*.h $DES_DIR/*.cc
生成可执行文件的Makefile
.SUFFIXES: .sh .h .c .cc .cpp
# 命令
AR        = ar
AR_FLAGS  = crs

CXX       = g++
CXXFLAGS  = -std=c++11 
# 地址变量
BASE_DIR  = ..
BUILD_DIR = $(BASE_DIR)/build
INC_DIR   = -I$(BASE_DIR)/pb
LIB_DIR   = 
# 依赖库
CLIBS     = -lprotobuf
CLIBS     += 
# 生成可执行文件
BIN       = $(BUILD_DIR)/test

SERVER_SRCS = $(wildcard *.cpp $(BASE_DIR)/pb/*.cc) 
SERVER_OBJS = $(patsubst %.cpp %.cc,%.o,$(SERVER_SRCS))

# make
all: build_dir bin 
build_dir bin :$(BUILD_DIR) $(BIN)

$(BIN):$(SERVER_SRCS)
	$(CXX) $(CXXFLAGS) $(INC_DIR) -o $@ $^ $(CLIBS)

$(BUILD_DIR):
	@-mkdir -p $(BUILD_DIR)	

# make clean
clean:
	@-rm -rf $(BUILD_DIR)

运行

zcm@vm:~/Documents/protobuf_test$ ./build/test 
serialize to string 
data size:32

	zhang sane�zhang@163.com
parse from string 
People: 
Name: zhang san
ID: 101
Email: zhang@163.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值