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
- https://www.bilibili.com/video/BV1rw411X7mY/
选中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生成的动态库的目录文章来源:https://www.toymoban.com/news/detail-738359.html
D:\ProgramData\protobuf\build\Debug
6. 配置属性 >> 链接器 >> 输入 >> 附加依赖项, 添加
*d.lib是在Debug模式下生成的库文件文章来源地址https://www.toymoban.com/news/detail-738359.html
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;
}
到了这里,关于Openssl数据安全传输平台003:Protobuf-3.17.2的编译-Windows:cmake+VS2022/ Centos7/8: make的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!