Protobuf如何集成到C++环境中(VS2019)

2023-10-27

前言

Protobuf是一种数据交换格式,类似于Json和XML。但Portobuf序列化后的包的大小要比Json和XML小很多,解包的速度也要快很多。这就是为什么需要学Protobuf的原因,在追求通讯速度的环境下,Protobuf要优于Json和XML。但Protobuf唯一稍微麻烦的是,protobuf没有可读性,必须得借助工具来解析。
工具和版本:

  • VS2019
  • CMake 3.19.2
  • protobuf 3.17.3

这篇教程主要是参考了官方教程来做的,英文好的同学可以自行去Protocol Buffers google 开发者网站查阅。要注意访问google网站需要科学上网。
先介绍下整个步骤:

  1. 下载Protocol Compiler和Protobuf Runtime
  2. 用CMake编译Protobuf Runtime生成libprotobufd.lib和libprotocd.lib库文件
  3. 编写自定义的.proto文件
  4. 用Protocol Compiler即protoc.exe生成.h和.cc文件
  5. 在VS工程中链接库文件,将google文件夹引入工程。引入生成的.h和.cc文件

下载安装Protocol Compiler和Protobuf Runtime

下载

建议英语好的同学,先阅读protobuf仓库主页 readme文件了解初步指南,再阅读protocbuf C++的安装指南 readme文件,了解不同系统的安装方法,最后阅读用CMake和MSVC编译Runtime readme文件,来完成库的生成。
第一手资料才最可靠。
先简单介绍下这两个东西。
Protocol Compiler是用来将我们自定义的.proto文件生成对应的数据结构源文件如C++的.cc和.h文件,改变输出参数也可以生成python的.py文件,java的.java文件等。

官方的语言支持有:C++ Java Python Objective-C C# Javascript Ruby Go PHP Dart。

Protobuf Runtime是用来生成库文件并且提供必要的文件,集成到你的代码里使用的。其实如果语言用的是C++的话,是不需要下载Protocol Compiler的,在编译时会生成protoc.exe来支持我们编译.proto文件。Protocol Compiler只是为了方便那些非C++语言的,这里我们还是两个都下载。
首先我们访问protobuf git仓库 releasesv3.17.3,如图,我们下载标识的两个文件(根据自己的系统的语言来),第一个就是runtime,第二个是compiler。
在这里插入图片描述

编译安装Protobuf Runtime

编译安装Runtime只需用到CMake和Visual Studio。
这里我用的是Developer Command Prompt for VS 2019命令行工具的,其实也可以用cmake的GUI的,参考protobuf(C++)的使用(windows)

ps:Developer Command Prompt for VS 与CMD的命令基本相同。只是Prompt for VS和CMD的环境不同,Prompt for VS可以调用Visual studio的所有工具如msbuild,而CMD必须要设置好PATH才能调用。

首先做一些准备工作,新建一个文件夹protobuftest,将下载的Runtime压缩包解压到protobuftest文件夹内。在protobuftest文件夹新建一个install文件夹。
在这里插入图片描述
后面的工作全部通过敲命令完成。
第二步,从应用中找到Developer Command Prompt for VS 2019应用,打开以后先进入指定盘符,然后敲入以下命令。
该命令的作用是,在cmake文件夹里创建一个build\release文件夹,并进入该目录。

D:\VS2019>E:
E:\>cd protobuftest\protobuf-cpp-3.17.3\cmake & mkdir build & cd build & mkdir release & cd release

第三步,输入以下指令,-G 后面的参数是选择生成什么makefile,-D后面跟的都是设置的参数CMAKE_BUILD_TYPE参数是编译类型,CMAKE_INSTALL_PREFIX是安装路径,给后面namke install指令指定路径的。编译的是cmake目录。这里的^符号是换行的意思,在CMD也能这么使用。

E:\protobuftest\protobuf-cpp-3.17.3\cmake\build\release>cmake -G "NMake Makefiles" ^
 -DCMAKE_BUILD_TYPE=Debug ^
 -DCMAKE_INSTALL_PREFIX=../../../../install ^
 ../..

然后输入nmake,开始编译。编译的时候感兴趣的可以去观察release文件夹。

E:\protobuftest\protobuf-cpp-3.17.3\cmake\build\release>nmake

在这里插入图片描述
编译完成后,输入nmake install指令。在install之前可以输入nmake check进行test,可能出现错误,但这边先不管,只要大多数case没有错误,我们使用起来是没有问题的。

E:\protobuftest\protobuf-cpp-3.17.3\cmake\build\release>nmake install

可以观察到install文件夹已经有了以下目录。
在这里插入图片描述
这里的bin目录下就是protoc.exe也就是我们的Protocol Compiler工具,include目录是我们需要引用到工程的文件,lib是静态库,也需要在工程设置中链接。

使用Protocol Compiler生成.cc和.h文件

首先我们写一个简单的proto文件。

syntax = "proto3";

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}

这里我们可以使用从git上下载下来的protoc.exe也可以用我们的install\bin目录下的protoc.exe。进入protoc.exe所在目录,按shifit+鼠标右键,选择在此处打开powershell窗口。输入以下命令:

PS E:\protobuftest\install\bin> .\protoc.exe --proto_path=.\ --cpp_out=.\ .\myproto.proto

这里proto_path指定的是.proto文件的目录,cpp_out是设置输出是用于C++的.cc和.h文件,后面跟的参数是生成文件的位置。
此时我们可以得到.cc和.h文件。
在这里插入图片描述

VS工程的配置

因为我们编译的是Debug的库,所以配置要选择Debug,平台要选择Win32平台。

  1. 配置 C/C++ → \rightarrow 常规 → \rightarrow 附加包含目录,设置include的文件目录
    在这里插入图片描述
  2. 配置 链接器 → \rightarrow 常规 → \rightarrow 附加库目录,设置lib文件目录
    在这里插入图片描述
  3. 配置 链接器 → \rightarrow 输入 → \rightarrow 附加依赖项,将三个lib文件填进去libprotobufd.lib;libprotobuf-lited.lib;libprotocd.lib

ps:debug的库带d,release的库不带。

在这里插入图片描述

  1. 最后设置 高级 → \rightarrow 高级属性 → \rightarrow MFC的使用,改成在静态库中使用MFC

MFC:Microsoft Foundation Class 微软基础类库
在这里插入图片描述

测试

使用如下代码进行测试

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <fstream>
#include "myproto.pb.h"
using namespace std;

int main()
{
    //std::cout << "Hello World!\n";
    SearchRequest data;
    data.set_query("yy");
    data.set_page_number(10);
    data.set_result_per_page(12);
    cout <<"origin data: "<< data.query() << "," << data.page_number() << "," << data.result_per_page()<<endl;
    fstream output("./log", ios::out | ios::trunc | ios::binary);
    //此处是执行序列化的操作,该方法执行完后,对应生成的二进制文件就保存在log文件中
    if (!data.SerializeToOstream(&output))
    {
        cerr << "failed to write msg." << endl;
        return -1;
    }
    getchar();
    if (output.is_open())
    {
        output.close();
    }
    SearchRequest parsedata;
    fstream input("./log", ios::in | ios::binary);
    //此处是执行反序列化的操作
    if (!parsedata.ParseFromIstream(&input))
    {
        cerr << "failed to parse message." << endl;
        return -1;
    }
    cout <<"after serialization and parse: "<< parsedata.query() << "," << parsedata.page_number() << "," << parsedata.result_per_page()<<endl;

    return 0;
    
}

工程我已经上传了,包括编译好的install文件夹,需要修改一下库和包含的路径才能使用,参考上文。资源链接
测试代码的作用是,将信息序列化后,存到工程目录的log文件下,然后在通过读取log文件,反序列化得到信息。
输出结果如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Protobuf如何集成到C++环境中(VS2019) 的相关文章

随机推荐

  • Python Selenium其他使用方法

    知识点 掌握selenium控制标签页的切换 掌握selenium控制iframe的切换 掌握 利用selenium获取cookie的方法 掌握 手动实现页面等待 掌握 selenium控制浏览器执行js代码的方法 掌握selenium开启
  • EDA笔记(1)--VHDL语言

    目的 摘录点自己容易忘的知识点 也可以供读者参考学习 EDA技术的概念 工作平台 计算机 开发环境 EDA软件 设计语言 硬件描述语言 HDL 试验载体 可编程逻辑器件 PLD 目标器件 ASIC芯片 应用方向 电子系统设计 EDA应用领域
  • LVM磁盘挂载&扩容

    磁盘不够了怎么使用逻辑卷的方式扩充磁盘呢 因为之前踩过坑 用混了fdisk和mount挂载 这次梳理下LVM挂盘和扩容方式 下载lvm2 预先下载程序包 若已下载则忽略 yum y install lvm2 离线下载可上腾讯软件源把rpm包
  • mysql数据库

    索引相当于字典的目录 用于查找数据 一般用B Tree索引 用该种数据结构来存储索引 InnoDB mysql的存储引擎 支持事务安全的引擎 支持外键 行锁 事务是他的最大特点 如果有大量的update和insert 转载于 https w
  • 玩转ChatGPT:Code interpreter (vol. 1)

    一 写在前面 喜大普奔 GPT 4传说中的Code interpreter插件已经可以用了 二 什么是Code interpreter 代码解释器 Code Interpreter 是一个工具 它能够读取和执行编程代码 这里有几个主要的功能
  • 如何将项目部署到服务器:从选择服务器到维护应用程序的全流程指南

    将项目部署到服务器是一个重要的技能 对于开发人员来说 它是必不可少的 在本文中 我将介绍一些关于如何将项目部署到服务器的最佳实践 一 选择服务器 在部署项目之前 你需要先选择一个适合你的服务器 如果你已经有一个可用的服务器 你可以直接使用它
  • 对象服务器文件服务器,传送对象到服务器

    h 文件中 h文件 png 代码如下 import interface LBNetWorkManager NSObject LBNetWorkManager netManager void Post NSString urlStr obj
  • nmap 操作系统探测

    1 操作系统探测原理 nmap 最著名的功能之一是用 TCP IP 协议栈 fingerprinting 进行远程操作系统探测 Nmap 发送一系列 TCP 和 UDP 报文到远程主机 检查响应中的每一个比特 在进行一打测试如 TCP IS
  • 【java】数组反转 已知一个数组 arr = {19, 28, 37, 46, 50}; 用程序实现把数组中的元素值交换,交换后的数组 arr = {50, 46, 37, 28

    public class Test05 public static void main String args 定义一个数组 用静态初始化完成数组元素的初始化 int arr 19 28 37 46 50 循环遍历数组 这一次初始化语句定义
  • 正则表达式校验邮箱

    正则表达式是一种用于匹配字符串的模式的工具 它可以用于验证邮箱地址的有效性 要用正则表达式校验邮箱地址 需要使用以下正则表达式 a zA Z0 9 a zA Z0 9 a zA Z0 9 0 61 a zA Z0 9 a zA Z0 9 a
  • ESP32的开发环境SDK4.3.1版本和编译环境搭建

    首先 到乐鑫的官网下载一个最完整的安装包 地址为 https dl espressif com dl esp idf idf 4 3 在这分为两种 在线安装和离线安装 在线安装与离线安装的区别 在线安装程序非常小 可以安装 ESP IDF
  • Mysql建表出现错误:ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that correspo

    Mysql命令行sql语句建表报错 这里是你的SQL语法有错误 查看与MySQL服务器版本对应的手册 以确定使用 我的问题是sql语句里反引号用成了单引号 我这里用的是英文中的单引号 所以会有语法报错 正确的应该是键盘ESC键下的反引号 此
  • Python, Numpy求 list 数组均值,方差,标准差

    代码如下 import numpy as np array 1 3 5 7 9 求均值 arr mean np mean array 求方差 arr var np var array 求标准差 arr std np std array dd
  • 第二十八篇 SeNet模型解析

    文章目录 一 SENet概述 二 SENet 结构组成详解 三 详细的计算过程 SE模块代码详解 SENet 在具体网络中应用 代码实现SE ResNet 第一个残差模块 第二个残差模块 SEResNet18 SEResNet34模型的完整
  • 毕业设计 基于stm32的智能快递仓库环境监控系统 - 物联网 嵌入式

    本次设计的快递仓库的火灾报警系统通过主控单元将各个传感器的参数值采集回来 包括与消防安全相关的温度 湿度 烟雾等 主控制器 数据采集回来之后通过无线的方式将数据上传到远端的上位机上 由于这些参数都是有一个安全阈值的 当达到这个阈值的时候很可
  • ubuntu 17.10, cuda 9.1, cuDNN 7.0 安装caffe时runtest报错

    如果在runtest caffe时报如下错误 则 可将Makefile中 Debugging ifeq DEBUG 1 COMMON FLAGS DDEBUG g O0 NVCCFLAGS G else COMMON FLAGS DNDEB
  • 最全的cursor问题解答 The most complete Cursor question answer 2023.6.27

    2023 6 27 目前最新版本是Cursor Setup 0 2 35 x64 官网是https www cursor so 作者是https twitter com amanrsanger 使用操作 Ctrl k Edit Instru
  • 终于满足了我司QA的接口自动化测试统计报表要求

    以前我司接口测试用的工具比较多 有postman jmeter等 不同部门用的工具还不一样 即使同一部门开发自测用的接口测试工具和测试用的可能都不一样 项目到提测阶段 QA都会要求我们测试人员统计 项目有多少接口 是否每个接口都有被接口自动
  • 人生感悟之——因果关系

    2020年了 31岁 算是步入中年 偶有感悟 记录在案 待来年回头印证 近年来的感悟是 做事踏踏实实 实事求是很重要 有一是一 适当夸大我自己的能力是可以 但是夸的太大 未来的某一天我会付出代价 至少夸大的部分我需要花费足够的时间的努力来补
  • Protobuf如何集成到C++环境中(VS2019)

    文章目录 前言 下载安装Protocol Compiler和Protobuf Runtime 下载 编译安装Protobuf Runtime 使用Protocol Compiler生成 cc和 h文件 VS工程的配置 测试 前言 Proto