文章目录
- 一、Windows环境
- 二、Linux Centos环境
- 三、protobuf测试
- 3.1 新建.proto文件生成相应的类
- 3.2 .proto生成相应的类的使用
- 3.3 配置VS
- 3.4 test代码
一、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
二、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
三、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
在工程中添加编译好的类文件
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;
}