Protobuf的简单使用

1、说明

本文主要介绍 Protobuf 库的在C++中的使用方式

平台:ubuntu 18.04

语言:C++

构建工具:cmake

2、Protobuf编译安装

github 下载所需要的 Protobuf 代码,本次下载:protobuf-cpp-3.21.3.tar.gz

解压后编译:

mkdir build && cd build cmake .. make -j6 sudo make install sudo ldconfig 

验证安装:

protoc --version #打印版本号 libprotoc 3.21.3 

3、cmake中使用

Protobuf 的使用方式很多,可以自行手动生成代码,也可以使用cmake自动生成

3.1、手动生成代码的方式

以下代码的目录结构为:

. ├── CMakeLists.txt ├── include 		#空文件夹,方便存储生成的代码 ├── main.cpp └── message     └── test.proto 

创建 cmake 项目,创建 proto 文件

//文件:test.proto //这里的package生成代码后,在c++中是命名空间 package test; message TestOne { //TestOne是类名 	required string name = 1; 	optional int32 age = 2; } 

使用protoc生成代码:

# protoc proto文件 -cpp_out=指定生成的代码路径 # --cpp_out表示生成C++代码,也可以制定多个不同语言 protoc message/test.proto --cpp_out=./include/ 

以上指令运行之后,则在 include 目录下生成 C++ 代码(.h 和 .cc)

目录结构是:

. ├── CMakeLists.txt ├── include │   └── message #目录层级和proto相同 │       ├── test.pb.cc #实现文件 │       └── test.pb.h  #头文件 ├── main.cpp └── message     └── test.proto 

项目中使用:

因为代码是手动生成的,所以 CMakeLists.txt 需要像自己写代码一样,把代码加入到项目中,如下:

cmake_minimum_required(VERSION 3.10) project(protobuf_test)  set(CMAKE_CXX_STANDARD 11)  # 生成的代码中还需要使用到protobuf包 find_package(Protobuf REQUIRED)  include_directories(./include) include_directories(./include/message)  #生成的的代码需要手动加入 add_executable(protobuf_test  	main.cpp  	include/message/test.pb.cc  	include/message/test.pb.h ) #因为生成的代码中还用到protobuf,所以还需要链接库 target_link_libraries(protobuf_test     ${PROTOBUF_LIBRARIES} ) 

代码如下:

#include <iostream> #include <test.pb.h> using namespace std; int main() {     test::TestOne testOne;     testOne.set_name("sherlock");     testOne.set_age(100);      cout << testOne.name() << endl;     cout << testOne.age() << endl;     return 0; } 

编译运行OK

3.2、cmake自动生成代码方式

3.1中使用指令生成代码是最基础的使用,但是一般项目中,大面积的使用,proto文件也会经常删减,自动化集成也不可能运行手动构建,因此支持自动构建是必然

CMakeLists.txt 文件修改如下:

cmake_minimum_required(VERSION 3.10) project(protobuf_test)  set(CMAKE_CXX_STANDARD 11) #protobuf包仍然是必须的 find_package(Protobuf REQUIRED)  include_directories(./include)  #主要是这句,使用protoc生成文件 PROTOBUF_GENERATE_CPP(SRCS HDRS message/test.proto)  add_executable(protobuf_test main.cpp ${PROTO_SRCS} ${PROTO_HDRS})  target_include_directories(protobuf_test     PUBLIC     ${PROTOBUF_INCLUDE_DIRS}     ${CMAKE_CURRENT_BINARY_DIR} ) target_link_libraries(protobuf_test     ${PROTOBUF_LIBRARIES} ) 

PROTOBUF_GENERATE_CPP 宏可以生成代码文件,并返回代码,第一个和第二个参数是传出值,分别表示生成的cpp文件和头文件,第三个参数指定 proto 文件,但是不能指定生成路径,生成的文件在编译根目录下

main.cpp 文件不变,编译运行即可

发表评论

相关文章