Openssl数据安全传输平台003:Protobuf-3.17.2的编译-Windows:cmake+VS2022/ Centos7/8: make

0 代码仓库及视频

0.1 Github代码仓库位置

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

0.2 视频

0.2.1 Centos7

https://www.bilibili.com/video/BV1we411R7sS/?vd_source=3353f83539e46042d8cf76efb177a8e4

06-Protobuf在Centos7系统上的安装:版本protobuf3.17.2

0.2.2 windows

https://www.bilibili.com/video/BV1rw411X7mY/?spm_id_from=333.999.0.0&vd_source=3353f83539e46042d8cf76efb177a8e4

05-Protobuf在Windows系统上的安装:版本protobuf3.17+cmake+vs2022

1 Windows环境配置

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

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

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

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

1.1 配置环境:

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

1.2 安装编译

具体的安装过程可以参考以下视频,大概半个小时就弄好了。

protobuf的安装:版本protobuf3.17.2+cmake+vs2022

在这里插入图片描述
选中Shared Libs,以后生成的就是静态库。

以Debug版本为例:

  • 我先勾选Shared Libs,生成了sln工程,在sln工程中编译生成了静态库;
  • 然后没有勾选了Shared Libs,生成了sln工程,在sln工程中编译生成了动态库。

在这里插入图片描述

1.3 配置VS

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

2 Linux Centos环境配置

2.1 下载必要的编译环境

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

2.2 下载Linux上用的压缩包

https://github.com/protocolbuffers/protobuf/releases?page=7

在这里插入图片描述

2.2.1 将包发送到Linux服务器上并解压缩

sudo tar -zxvf protobuf-all-3.17.2.tar.gz

2.2.2 进入到压缩包所在的文件夹配置configure

这里我们是把protobuf安装在了系统目录下,因此使用的时候只有root用户能使用protoc相关的命令和库文件、头文件。

如果是需要使用普通用户对程序进行编译,需要在相应的用户目录下配置protobuf环境。

sudo ./configure --prefix=/home/beza/protobuf

这里我们在系统下进行配置:

sudo ./configure --prefix=/usr/local/protobuf

在这里插入图片描述

2.2.3 运行makefile文件

sudo make

在这里插入图片描述

----------漫长的等待-----------

在这里插入图片描述

2.2.4 make install将文件安装到2.2.2设置的目录中

sudo make install

在这里插入图片描述很快就安装好了
在这里插入图片描述

2.2.5 在2.2.2配置的目录下就会有bin/lib/include,相关文件均配置好

在这里插入图片描述

2.3 修改环境变量

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/

2.4 验证安装

protoc --version

source /etc/profile

在这里插入图片描述

Q:程序使用protobuf,编译没有问题,运行时一到建立protobuf对象就崩溃

后来偶然看到以前正常使用的makefile文件中后面加了-lpthread,加上就好了。我自己的程序没有用到多线程,应该是protobuf3里面用到了。

2.5 编译的时候要加上

g++ XXX.cpp -L/usr/local/protobuf/include -lprotobuf 

三、Wnidows环境下protobuf测试

假设要序列化的数据为

// 要序列化的数据
struct Persion
{
    int id;
    string name;
    string sex;	// man woman
    int 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)在使用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

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值