VS2022配置protobuf环境
*必须实例化,用main函数建立测试案例,否则无法正常编译
Protobuf版本3.21.12这是最后一个简单编译的版本,不依赖其他库
链接在这里:
https://github.com/protocolbuffers/protobuf/releases/download/v21.12/protobuf-cpp-3.21.12.zip
Cmake构建protobuf
解压并且得到对应的protobuf文件夹,建立build文件夹用于cmake生成项目文件
打开camke-gui 按图设置对应的目录
点击configure
选择VisualStudio 17 2022 平台选择x64
点击Finish
如图选择进行项目构建
点击Generate创建项目,点击OpenProject打开项目
此时会自动打开vs2022
直接运行项目,此时输出窗口会有编译信息,等待编译完成
出现如图就表示编译成功了,无法启动是正常现象
配置库和环境变量
打开刚才创建的build目录,里面有一个Debug目录,进入此目录,会有如下文件
在自己的第三方库目录下创建bin ;include;lib目录
将这三个文件放入lib目录下
将刚开始解压的protobuf-3.21.12目录下的src文件夹打开,google目录是我们需要的包含文件,将google目录拷贝进创建的include目录
接下来配置环境变量,这部分不细讲
打开PowerShell或者cmd,输入protoc –version查看版本
构建测试案例
建立一个测试案例
创建一个msg.proto文件
内容
syntax = "proto3";
message RequestMsg
{
int32 cmdType = 1;
bytes clientID = 2;
bytes serverID = 3;
string sign = 4;
string data = 5;
}
message RespondMsg
{
int32 status = 1;
int32 seckeyID = 2;
bytes clientID = 3;
bytes serverID = 4;
string data = 5;
}
保存并且退出,在proto文件的同目录下打开终端
输入protoc .\msg.proto –cpp_out=.
回车会在文件夹里得到pb.cc 和pb.h文件
打开vs创建新项目,把生成的msg.pb.cc和msg.pb.h文件添加进项目
创建main.cpp
必须创建,只编译cc和头文件一定会报错
#include <iostream>
#include <string>
#include "msg.pb.h"
using namespace std;
int main() {
// 创建 RequestMsg 对象并设置字段
RequestMsg requestMsg;
requestMsg.set_cmdtype(1);
requestMsg.set_clientid("client123");
requestMsg.set_serverid("server456");
requestMsg.set_sign("signature");
requestMsg.set_data("Hello, this is a test message.");
// 序列化 RequestMsg 到字符串
string serializedRequest;
if (!requestMsg.SerializeToString(&serializedRequest)) {
cerr << "RequestMsg 序列化失败" << endl;
return -1;
}
cout << "RequestMsg 序列化成功,字节长度:" << serializedRequest.size() << endl;
// 反序列化 RequestMsg
RequestMsg deserializedRequest;
if (!deserializedRequest.ParseFromString(serializedRequest)) {
cerr << "RequestMsg 反序列化失败" << endl;
return -1;
}
cout << "RequestMsg 反序列化结果:" << endl;
cout << "cmdType: " << deserializedRequest.cmdtype() << endl;
cout << "clientID: " << deserializedRequest.clientid() << endl;
cout << "serverID: " << deserializedRequest.serverid() << endl;
cout << "sign: " << deserializedRequest.sign() << endl;
cout << "data: " << deserializedRequest.data() << endl;
// 创建 RespondMsg 对象并设置字段
RespondMsg respondMsg;
respondMsg.set_status(200);
respondMsg.set_seckeyid(12345);
respondMsg.set_clientid("client123");
respondMsg.set_serverid("server456");
respondMsg.set_data("Response data goes here.");
// 序列化 RespondMsg 到字符串
string serializedRespond;
if (!respondMsg.SerializeToString(&serializedRespond)) {
cerr << "RespondMsg 序列化失败" << endl;
return -1;
}
cout << "RespondMsg 序列化成功,字节长度:" << serializedRespond.size() << endl;
// 反序列化 RespondMsg
RespondMsg deserializedRespond;
if (!deserializedRespond.ParseFromString(serializedRespond)) {
cerr << "RespondMsg 反序列化失败" << endl;
return -1;
}
cout << "RespondMsg 反序列化结果:" << endl;
cout << "status: " << deserializedRespond.status() << endl;
cout << "seckeyID: " << deserializedRespond.seckeyid() << endl;
cout << "clientID: " << deserializedRespond.clientid() << endl;
cout << "serverID: " << deserializedRespond.serverid() << endl;
cout << "data: " << deserializedRespond.data() << endl;
// 关闭 Protobuf 库
google::protobuf::ShutdownProtobufLibrary();
return 0;
}
接下来配置vs项目环境
预处理器定义加入
_SCL_SECURE_NO_WARNINGS
_PROTOBUF_USE_DLLS
libprotobufd.lib
libprotobuf-lited.lib
libprotocd.lib
文件大量报错不用管,只要不是include报错就行,同时在头文件加入
#define PROTOBUF_USE_DLLS
执行项目得到以下
环境配置成功