5

Protobuf的简单使用 - sherlock_lin

 2 years ago
source link: https://www.cnblogs.com/sherlock-lin/p/16518917.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文主要介绍 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 文件不变,编译运行即可


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK