protobuf c++开发快速上手指南

ops/2024/12/15 21:11:42/

1、环境准备

在c++环境使用 protobuf,需要安装protobuf runtime以及protobuf的编译器:protoc,其作用如下表格:

需要安装的环境作用
protoc将proto文件编译成c++源码
protobuf runtime编译c++源码需要链接到protobuf库

注意:protoc与runtime的版本必须一致,否则会导致后面业务代码编译失败,当前最新版本为:V29.1,我们选用最新版本进行安装。

1.1 protoc编译器安装

这一步可选,runtime安装时,也会编译protoc编译器。

protoc编译器的下载地址:Release Protocol Buffers v29.1 · protocolbuffers/protobuf · GitHub

下载对应环境的编译好的版本,解压后,共有三个文件夹:

protoc编译器位于bin目录下,将protoc放到开发环境的$PATH目录下即可。 

1.2 c++ protobuf runtime安装

1.2.1 c++ protobuf编译工具cmake安装

cmake下载地址:Download CMake

cmake安装很简单,可以直接下载可执行文件,也可以通过源码安装。

下载3.28.1版本,并解压:

将bin目录下cmake可执行文件复制到usr/bin或者其他存在于环境变量PATH的路径中。

将share文件夹下:cmake-3.28 拷贝到/usr/share路径下:

 

1.2.2 c++ protobuf源码编译

首先下载源码,最新发布版本V29.1

切换到v29.1版本后,更新代码:

git pull origin v29.1

之后拉取依赖:

git submodule update --init --recursive

 

开始编译源码,禁止单元测试,同时protobuf要求c++版本到17 

执行编译:make -j8

 

优秀,编译很快,比我阿里云上C2M4的机器快多了。接下来看一下编译产出:

protoc也编译出来了,复制到PATH目录即可使用

同时install  protobuf库:sudo make install

2、代码调试

2.1 proto编写&编译

proto我们就使用官方的实例代码,只是将proto2改成proto3,因为proto2不常用了。

syntax = "proto3";package tutorial;message Person {optional string name = 1;optional int32 id = 2;optional string email = 3;enum PhoneType {PHONE_TYPE_UNSPECIFIED = 0;PHONE_TYPE_MOBILE = 1;PHONE_TYPE_HOME = 2;PHONE_TYPE_WORK = 3;}message PhoneNumber {optional string number = 1;optional PhoneType type = 2;}repeated PhoneNumber phones = 4;
}message AddressBook {repeated Person people = 1;
}

编译protobuf,使用protoc工具,编译protobuf为c++语言:protoc -I=./ --cpp_out=./ address_book.proto

2.2 测试代码

主程序:

#include <iostream>
#include "address_book.pb.h"
using namespace std;int main() {string names[3] = {"John", "Jane", "Jack"};string emails[3] = {"john.doe@example.com", "tom.dan@example.com","lucy_lily@163.com"};tutorial::AddressBook address_book;for (size_t i = 0; i < 3; i++) {/* code */tutorial::Person* person = address_book.add_people();person->set_name(names[i]);person->set_id(i+1);person->set_email(emails[i]);}for (size_t i = 0; i < address_book.people_size(); i++) {cout << "Name: " << address_book.people(i).name() << endl;cout << "ID: " << address_book.people(i).id() << endl;cout << "Email: " << address_book.people(i).email() << endl;}return 0;
}

 CMakeLists.txt:   

cmake_minimum_required(VERSION 3.18)
project(protobuf-study)
# Find required protobuf package
find_package(protobuf CONFIG REQUIRED)if(protobuf_FOUND)message(STATUS "Using Protocol Buffers ${protobuf_VERSION}")
endif()include_directories(${PROJECT_BINARY_DIR})
aux_source_directory(. SRC)add_executable(protobuf-study ${SRC})
target_link_libraries(protobuf-study protobuf::libprotobuf)

编译测试代码,注意由于新版本protobuf依赖c++17,因此编译测试代码时也需要指定c++版本,否则会报错:cmake .. -DCMAKE_CXX_STANDARD=17

运行可执行文件: 

大功告成。 


http://www.ppmy.cn/ops/142206.html

相关文章

bain.js(十二):RNN神经网络实战教程 - 音乐乐谱生成 -人人都是作曲家~

系列文章&#xff1a; &#xff08;一&#xff09;&#xff1a;可以在浏览器运行的、默认GPU加速的神经网络库概要介绍&#xff08;二&#xff09;&#xff1a;项目集成方式详解&#xff08;三&#xff09;&#xff1a;手把手教你配置和训练神经网络&#xff08;四&#xff09…

如何实现后端返回excel文件,在前端下载功能

前言 简单记录一下&#xff0c;excel文件导出下载功能 一、后端接口返回excel文件 把自己生成的workbook 以文件流的方式&#xff0c;返回前台 Workbook workbook employeeConfirmationDefectService.exportPoorPolishExcel(budatBegin, budatEnd, queryWrapper);//传输到…

触想工业一体机为高速公路远程供电提供稳定保障

一、行业应用概述 放眼高速公路沿线场景&#xff0c;常常会看到许多外场设备&#xff0c;比如摄像头、气象仪、情报板、ETC门架等&#xff0c;这些设备的应用都离不开电力支撑。 △ 高速公路外场设备 然而&#xff0c;随着高速里程越来越长&#xff0c;在远离市电的情况下&…

数据仓库工具箱—读书笔记01(数据仓库、商业智能及维度建模初步)

数据仓库、商业智能及维度建模初步 记录一下读《数据仓库工具箱》时的思考&#xff0c;摘录一些书中关于维度建模比较重要的思想与大家分享&#x1f923;&#x1f923;&#x1f923; 博主在这里先把这本书"变薄"~有时间的小伙伴可以亲自再读一读&#xff0c;感受一下…

MFC学习笔记专栏开篇语

MFC&#xff0c;是一个英文简写&#xff0c;全称为 Microsoft Foundation Class Library&#xff0c;中文翻译为微软基础类库。它是微软开发的一套C类库&#xff0c;是面向对象的函数库。 微软开发它&#xff0c;是为了给程序员提供方便&#xff0c;减少程序员的工作量。如果没…

陪玩系统小程序源码/游戏陪玩APP系统用户端有哪些功能?游戏陪玩小程序APP源码开发

多客陪玩系统-游戏陪玩线下预约上门服务等陪玩圈子陪玩社区系统源码 陪玩系统源码&#xff0c;高质量的陪玩系统源码&#xff0c;游戏陪玩APP源码开发&#xff0c;语音陪玩源码搭建: 线上陪玩活动组局与线下家政服务系统的部署需要综合考虑技术选型、开发流程、部署流程、功能实…

【c++线程库】

文章目录 线程创建方式mutex条件变量atomic 线程创建方式 头文件 #include<thread>线程创建传个可执行对象就可以&#xff0c;如函数指针&#xff0c;仿函数&#xff0c;lambda&#xff0c;包装器。后面的Args是可变参数包。 使用函数指针创建线程 void fun(int&…

抖音后端实习一面总结

置之死地而后生 抖音后端开发实习一面 自我介绍 你参加了PAT比赛&#xff1f;介绍一下&#xff1f; 平时有刷题吗&#xff1f;有的&#xff0c;那来做一下算法题目吧&#xff0c;单词拆分&#xff08;动态规划1h过去了...&#xff09; TCP有哪些状态&#xff1f;每种状态代表…