Openssl数据安全传输平台003:Protobuf - 部署

文章目录

  • Github代码仓库位置
  • 一、Windows环境配置
    • 生成库文件之后—>参考3.3 配置VS
      • 1. 先将平台设置为所有平台
      • 2. 配置属性 >> C/C++ >> 常规 >> 附加包含目录
      • 3. 配置属性 >> C/C++ >> 预处理器 >> 预处理器定义,添加
      • 4. 配置属性 >> C/C++ >> 代码生成 >> 运行库 ,选择:`多线程调试(/Mtd)`(根据自己的)
      • 5. 配置属性 >> 链接器 >> 常规 >> 附加库目录, 添加
      • 6. 配置属性 >> 链接器 >> 输入 >> 附加依赖项, 添加
  • 二、Linux Centos环境配置
  • 三、Wnidows环境下protobuf测试
    • 3.1 新建.proto文件生成相应的类
    • 3.2 .proto生成相应的类的使用
    • 3.3 配置VS
      • 1. 先将平台设置为所有平台
      • 2. 配置属性 >> C/C++ >> 常规 >> 附加包含目录
      • 3. 配置属性 >> C/C++ >> 预处理器 >> 预处理器定义,添加
      • 4. 配置属性 >> C/C++ >> 代码生成 >> 运行库 ,选择:`多线程调试(/Mtd)`
      • 5. 配置属性 >> 链接器 >> 常规 >> 附加库目录, 添加
      • 6. 配置属性 >> 链接器 >> 输入 >> 附加依赖项, 添加
    • 3.4 test代码

Github代码仓库位置

https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform/tree/main/Protobuf

一、Windows环境配置

在windows下配置,无论protobuf是什么版本,IDE和编译器的版本都要保持一致。

比如,protobuf的cpp使用在cmake生成工程的时候选择了对应的IDE及A编译器,就应该在同样使用A编译器的及对应版本的IDE上运行,否则容易报错。

我使用cmake3.27,因为cmake3.27在configure的时候有vs2022的选项,但是别的版本不一定有vs2022。在使用cmake3.27对protobuf3.17源文件生成工程后,对应的输出文件夹下会生成vs的sln文件,再使用对应版本的vs2022进行编译,生成protoc执行文件和库文件。

这里面有一个坑,在vs2022进行编译的时候,如果使用debug对protobuf-cpp工程进行编译生成库文件,那么后期在使用库文件时候,就要在对应的工程上指定相应的运行库和附加依赖项目。

配置环境:

操作系统:windows10
Visual Studio:vs2022社区版
Cmake版本:cmake3.27.7
Protobuf版本:protobuf3.17和对应的cpp文件包

具体的安装过程可以参考以下视频,大概半个小时就弄好了。
protobuf的安装:版本protobuf3.17+cmake+vs2022

生成库文件之后—>参考3.3 配置VS

在工程中添加编译好的类文件
在这里插入图片描述
接下来的步骤比较关键

1. 先将平台设置为所有平台

2. 配置属性 >> C/C++ >> 常规 >> 附加包含目录

选择google文件夹所在的目录,应该是下载的protobuf对应版本下的src文件夹(包含google文件),也可以把google文件夹单独拿出来新建include文件夹,我的是:

D:\ProgramData\protobuf\protobuf-3.17.2\src

在这里插入图片描述

3. 配置属性 >> C/C++ >> 预处理器 >> 预处理器定义,添加

_CONSOLE;
_SCL_SECURE_NO_WARNINGS;
_PROTOBUF_USE_DLLS

4. 配置属性 >> C/C++ >> 代码生成 >> 运行库 ,选择:多线程调试(/Mtd)(根据自己的)

在使用Visual Studio链接依赖库时,经常性的会出现下面几种错误

error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MTd_StaticDebug” error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”

列表中的第一个错误是静态库的Release、Debug版本引起的,只需要知道对应的库是Release、还是Debug做相应的修改就行;

列表中的第二个错误是要引用的是静态库,但是配置成动态库导致的,只需要修改成”多线程(/Mtd)“就可。

别的报错还可以参考,或者排列组合都试试
error LNK2038: 检测到“RuntimeLibrary”的不匹配项

5. 配置属性 >> 链接器 >> 常规 >> 附加库目录, 添加

这里添加的是protobuf生成的动态库的目录

D:\ProgramData\protobuf\build\Debug

6. 配置属性 >> 链接器 >> 输入 >> 附加依赖项, 添加

*d.lib是在Debug模式下生成的库文件

libprotobufd.lib;
libprotocd.lib

二、Linux Centos环境配置

1、下载必要的编译环境

sudo yum install autoconf automake libtool curl make gcc-c++ unzip

2、下载安装包并发送到Linux服务器上新建的protobuf文件夹
3、解压缩并将整个文件夹移动到系统目录下

sudo mv -f protobuf /usr/local/

4、修改环境变量

sudo vim /etc/profile
# 添加内容如下:
#(动态库搜索路径) 程序加载运行间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
#(静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
#执行程序搜索路径
export PATH=$PATH:/usr/local/protobuf/bin/
#c程序头文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
#c++程序头文件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/

5、验证安装

protoc --version

在这里插入图片描述

三、Wnidows环境下protobuf测试

假设要序列化的数据为

// 要序列化的数据
struct Persion
{int id;string name;string sex;	// man womanint age;
};

3.1 新建.proto文件生成相应的类

syntax = "proto3";message Persion
{int32 id = 1;   // 编号从1开始repeated bytes name = 2;string sex = 3;int32 age = 4;
}

新建.proto文件

syntax = "proto3";message Persion
{int32 id = 1;   // 编号从1开始repeated bytes name = 2;string sex = 3;int32 age = 4;
}

打开终端输入命令,自动生成相应的类,可以直接放到工程中用

protoc Persion.proto --cpp_out=./

在这里插入图片描述

3.2 .proto生成相应的类的使用

创建一个空项目,把上面生成的类放到工程文件下并添加现有项
在这里插入图片描述

3.3 配置VS

在工程中添加编译好的类文件
在这里插入图片描述
接下来的步骤比较关键

1. 先将平台设置为所有平台

2. 配置属性 >> C/C++ >> 常规 >> 附加包含目录

选择google文件夹所在的目录,应该是下载的protobuf对应版本下的src文件夹,也可以单独拿出来,我的是:

D:\ProgramData\protobuf\protobuf-3.17.2\src

3. 配置属性 >> C/C++ >> 预处理器 >> 预处理器定义,添加

_CONSOLE;
_SCL_SECURE_NO_WARNINGS;
_PROTOBUF_USE_DLLS

4. 配置属性 >> C/C++ >> 代码生成 >> 运行库 ,选择:多线程调试(/Mtd)

5. 配置属性 >> 链接器 >> 常规 >> 附加库目录, 添加

这里添加的是protobuf生成的动态库的目录

D:\ProgramData\protobuf\build\Debug

6. 配置属性 >> 链接器 >> 输入 >> 附加依赖项, 添加

*d.lib是在Debug模式下生成的库文件

libprotobufd.lib;
libprotocd.lib

3.4 test代码

#include <iostream>
#include "Persion.pb.h"
using namespace std;
/*message Persion{int32 id = 1;   // 编号从1开始string name = 2;string sex = 3;int32 age = 4;}
*/
int main()
{// 1. 创建persion对象, 并初始化Persion p;p.set_id(1001);// 申请一块内存, 存储名字p.add_name();p.set_name(0, "路飞");p.set_sex("man");p.set_age(17);// 2. 将persion对象序列化 -> 字符串string output;p.SerializeToString(&output);cout << "序列化后的数据: " << output << endl;// 3. 数据传输// 4. 接收数据, 解析(output) -> 解码 -> 原始数据// 4.1 创建Persion对象Persion pp;pp.ParseFromString(output);// 将Info对象值取出// 5. 处理原始数据 -> 打印数据信息cout << "id: " << pp.id() << ", name: "<< pp.name(0) << ", "<< ", sex: " << pp.sex() << ", age: " << pp.age()<< endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1024程序员节:理解编码背后的艺术

1024的含义 "1024"在中国互联网文化中有两个主要的含义&#xff1a; 1024是2的10次方&#xff0c;这在计算机科学中是一个重要的数字&#xff0c;因为计算机的基础是二进制。因此&#xff0c;程序员们常常把1024作为一个特殊的日子来庆祝&#xff0c;也就是10月24日…

laravel框架介绍(一)

laravel框架是一套简洁&#xff0c;优雅的PHPWeb开发框架。

【PG】PostgreSQL字符集

目录 设置字符集 1 设置集群默认的字符集编码 2 设置数据库的字符集编码 查看字符集 1 查看数据字符集编码 2 查看服务端字符集 3 查看客户端字符集 4 查看默认的排序规则和字符分类 被支持的字符集 PostgreSQL里面的字符集支持你能够以各种字符集存储文本&#xff0c…

【Rust 易学教程】学前准备:Cargo, 你好

当你开始学习 Rust 时&#xff0c;很快就会遇到 Cargo&#xff0c;它是 Rust 生态系统中用于构建和运行 Rust 应用程序的标准工具。在 《Rust 易学教程》 首篇中&#xff0c;我会简要概述一下 Cargo 是什么&#xff0c;以及它如何适应更广泛的生态系统。 安装 请按照 https:/…

CImageList 图像列表

一、CImageList类Create函数参数解析 BOOL Create(int cx,int cy,UINT nFlags,int nInitial,int nGrow ); 1.1&#xff09; cx,cy&#xff1a;图片的实际像素宽与高&#xff1b; nFlags&#xff1a;创建图像列表的类型,包括4/8/16/24/32/位色&#xff1b; nFlags确定建立图…

经管博士科研基础【26】海塞矩阵

1. 海塞矩阵 海塞矩阵是一个由多变量实值函数的所有二阶偏导数组成的方块矩阵。 一元函数就是二阶导,多元函数就是二阶偏导组成的矩阵。求向量函数最小值时可以使用,矩阵正定是最小值存在的充分条件。经济学中常常遇到求最优的问题,目标函数是多元非线性函数的极值问题,尚…

【大数据】Kafka 实战教程(二)

Kafka 实战教程&#xff08;二&#xff09; 1.下载2.安装3.配置4.运行4.1 启动 Zookeeper4.2 启动 Kafka 5.第一个消息5.1 创建一个 Topic5.2 创建一个消息消费者5.3 创建一个消息生产者 1.下载 你可以在 Kafka 官网&#xff1a;http://kafka.apache.org/downloads&#xff0c…

发布使用npm包过程

发布npm包过程 1配置组件库文件的package.json //组件库的名字&#xff0c;npm包的名字"name": "test1","version": "0.1.7",// 组件入口文件"main": "src/index.js",// git仓库地址,giturl项目具体的git地址。…

4个顶点的无向完全图一共有多少个生成树

一个无向完全图是一个具有4个顶点&#xff0c;每一对顶点之间都有一条边的图。要计算无向完全图的生成树数量&#xff0c;可以使用基于Cayley定理的方法。 Cayley定理指出&#xff0c;一个完全图有n个顶点的生成树数量等于n^(n-2)。因此&#xff0c;在一个具有4个顶点的无向完…

玩游戏缺失“d3d11.dll丢失“的问题的五种解决方案

在我日常的计算机维护工作中&#xff0c;经常遇到一些用户报告他们遇到了"d3d11.dll丢失"的问题。这是一个常见的Windows系统错误&#xff0c;通常会导致程序无法正常运行。在这篇文章中&#xff0c;我将分享我找到的五种有效的解决方法&#xff0c;以帮助这些用户解…

力扣:134. 加油站(Python3)

题目&#xff1a; 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组…

Selenium获取百度百科旅游景点的InfoBox消息盒

前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒&#xff0c;同样可以通过Spider获取网站内容&#xff0c;最近学习了SeleniumPhantomjs后&#xff0c;准备利用它们获取百度百科的旅游景点消息盒&#xff08;InfoBox&#xff09;&#xff0c;这也是毕业设计实体对齐和属…

Linux下的命令行参数和环境变量

命令行参数 什么是命令行参数 命令行参数是指在执行命令行程序时&#xff0c;给程序传递的额外参数。在Linux终端中&#xff0c;命令行参数通常通过在命令后面添加空格分隔的参数来传递。 Linux下以main函数举例说明 #include<stdio.h>int main(int argc char* argv[])…

C++入门(3):引用,内联函数

一、引用 1.1 引用特性 引用必须初始化 一个变量可以有多个引用 引用一旦引用一个实体&#xff0c;就不能引用其他实体 int main() {int a 10, C 20;int& b a;b c; // 赋值&#xff1f;还是b变成c的别名&#xff1f;return 0; }1.2 常引用 引用权限可以平移或缩小…

MySQL实践——分页查询优化

问题现象 一个客户业务系统带有分页查询功能&#xff0c;但是随着查询页数的增加&#xff0c;越往后查询性能越差&#xff0c;有时一个查询可能需要1分钟左右的时间。分页查询的写法类似于&#xff1a; select * from employees limit 250000,5000;这是最传统的一种分页查询写…

AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 (三)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

GB28181学习(十一)——控制(PTZ、镜头、光圈等控制)

要求 源设备向目标设备发送控制命令&#xff0c;控制命令类型包括&#xff1a; 摄像机云台控制远程启动录像控制报警布防/撤防报警复位强制关键帧拉框放大/缩小看守位控制PTZ精准控制存储卡格式化目标跟踪软件升级设备配置 设备配置的内容包括&#xff1a; 基本参数视频参数范…

React TypeScript安装npm第三方包时,些包并不是 TypeScript 编写的

npm install types/包名称 例如&#xff1a;npm install types/jquery 学习链接

QSPI介绍

0 Preface/Foreword 1 QSPI介绍

Python 编程语言的介绍

Python 是一种高级、动态类型的解释型语言。由 Guido van Rossum 于1989年底发明&#xff0c;并在1991年首次发布。Python 的设计哲学强调代码的可读性和简洁的语法&#xff0c;特别是使用缩进来表示代码块&#xff0c;这使得开发者能够用更少的代码表达想法。 基础概念: 语法…