QT中如何使用protobuf,配图详解

1. 下载cmake并安装, cmake的版本可选最新版

1.1官网链接:https://cmake.org/download/

打开官网链接:下拉找到如下图所示的地方
我下载的是第二个window ×64 zip的, 这个解压即可以使用,不用安装,第一个需要安装,大家需要哪个用哪个吧,都行
我个人使用的版本:CMake 3.21.1下面是我的网盘链接
链接:https://pan.baidu.com/s/1PaVhE9Ekt7Uf5y0ITQ1kMw
提取码:1111
在这里插入图片描述

1.2下载完成后解压进入软件的bin目录,双击cmake hui.exe,能打开即可

在这里插入图片描述
要注意的是,解压的路径中不能有中文路径,否则后面会出现莫名的错误
在这里插入图片描述

2. 下载protobuf的源码:https://github.com/google/protobuf/releases

这个网站需要访问外网,里面有一系列版本和不同语言的源码,我这里用的是C++的,不建议使用最新版本,容易出bug, 点击蓝色所对应的文件,即可下载
在这里插入图片描述
如果不能访问外网或者访问速度过慢或者出现问题,可以下载我使用的版本, 我使用的是3.15.0版本的,我的网盘链接如下
链接:https://pan.baidu.com/s/14Sm8EIS-Az7coP48xVPjUA
提取码:1111
可以在D盘建立一个文件夹,解压到该文件夹中中,我的文件夹名是protobuf_vision
在该文件夹中在建立一个output文件夹,用于存储编译protobuf产生的文件
也要注意的是,解压的路径中不能有中文路径,否则后面会出现莫名的错误
在这里插入图片描述

前期工作准备完成,正式开始撸了

3,打开CMake这个软件

在这里插入图片描述

1.点击浏览资源,进入我们下载的源码目录,cmake, 点击选择文件夹

在这里插入图片描述

在这里插入图片描述

3.点击browse build,也就是我们编译后产生文件的地方,进入我们前面建立的文件夹output, 点击选择文件夹,因为我编译过了,所以里面已经有文件了,没有编译过是空的文件夹

在这里插入图片描述

4.点击configure, 配置

在这里插入图片描述

5.然后选择Mingw makefiles, 如下图

在这里插入图片描述

6.点击finish, 完成配置后,如下图

在这里插入图片描述
如果点击finish后出现这些错误提示的
在这里插入图片描述
在这里插入图片描述
解决方案在我的另一篇文章里
cmake配置Qt的protobuf环境时出现Error in configuration process, project files may be invalid解决办法

7. 把一些√√去掉或者加上去,如下图所示

在这里插入图片描述

8. √选Advanced,在下面的地方加上-std=gnu++11, 如图所示

在这里插入图片描述

9. 点击generate, 产生要编译的文件

在这里插入图片描述

如下图,代表成功了

在这里插入图片描述

10. 我们去文件夹output查看我们产生的文件,下图是我已经编译过的,文件比没有编译过的要多得多,你们过了步骤12后,也会产生那么多文件的,先别管那么多,继续下一步先

在这里插入图片描述

11. 在output文件目录下按住shift然后鼠标右键弹出右键菜单,选择在此处打开Powershell窗口,打开后如图所示

在这里插入图片描述

12.我们输入命令mingw32-make,回车

12.1 如果出现这种提示的,就需要添加Qt mingw32的环境变量了,我们要知道Qt的安装位置, 复制地址即可在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
如果是出现这种提示的
在这里插入图片描述
将Qt安装目录Tools\mingw730_32\bin添加到环境变量中即可
在这里插入图片描述

12.2 添加好环境变量后,进行上述步骤,回车然后就会进行编译,会有编译进度显示和一大堆的编译信息

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
我的这里编译出了点问题,到93%就停了,不过没事,经我测试,不影响后序的使用,没出问题当然是最好的
在这里插入图片描述
会发现产生了一大堆的文件,最重要的是protoc.exe这个文件,这是我们编译.proto的必备文件
v

13. 在这里新建一个protobuild.bat的文件,文件内容如下为protoc --cpp_out=./ %1%

在这里插入图片描述
在这里插入图片描述

14. 我们进入cmd命令行,然后切换进output目录后,输入命令,protobuild 要编译的文件,或者直接输入protoc --cpp_out=./ 要编译的文件, 也就是在当前目录下生成编译好的文件在这里插入图片描述

我这里使用的是bike.proto文件,文件内容如下

syntax = "proto2";

package tutorial;

message mobile_request
{
    required string mobile = 1;
}

message mobile_response
{
    required int32 code   = 1;   //响应代号
    required int32 icode  = 2;   //验证码
    optional string data  = 3;   //失败原因
}


message login_request
{
    required string mobile  = 1;    // 手机号码
    required int32  icode   = 2;    // 验证码
}


message login_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
}

message recharge_request
{
    required string mobile  = 1;    // 手机号码
    required int32  amount  = 2;    // 充值金额
}


message recharge_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    required int32  balance = 3;    // 最新的余额
}

message account_balance_request
{
    required string mobile = 1;
}

message account_balance_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    required int32  balance = 3;
}

message list_account_records_request
{
    required string mobile = 1;
}

message list_account_records_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    message account_record
    {
        required int32  type      = 1; // 0 : 骑行消费,  1 : 充值, 2 : 退款
        required int32  limit     = 2; // 消费或者充值金额
        required uint64 timestamp = 3; // 记录发生时的时间戳
    }

    repeated account_record records = 3;
}

message list_travel_records_request
{
    required string mobile = 1;
}

message list_travel_records_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    message travel_record
    {
        required uint64 stm      = 1;   // start timestamp
        required uint32 duration = 2;   // 骑行时长
        required uint32 amount   = 3;   // 所耗金额
    }

    required double              mileage   = 3; // 里程
    required double              discharge = 4; // 排放
    required double              calorie   = 5; // 卡路里
    repeated travel_record       records   = 6;
}

当前目录生成编译好的文件如下图所示
在这里插入图片描述

15. 打开Qt, 建立一个项目,添加我们生成的pb.ccpb.h文件,编译后此时我们会发现存在一大堆的问题,报错,怎么办呢,我们来接着下一步

在这里插入图片描述

16. 我们进入项目的.pro文件,在如下位置加入protobuf的路径和链接库位置

我的路径是:

INCLUDEPATH += D:\protobuf_vision\protobuf-3.15.0\src

LIBS += -LD:\protobuf_vision\output -lprotobuf

在这里插入图片描述

  1. 再次进行编译,发现报错全部没有了,ok, 完成啦, 写文章不容易,对你有帮助的点赞或收藏在走哦
    -------------毕设遇到的坎-写于2021-10-08 半夜0:28
  • 17
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
Qt使用Protocol Buffers(protobuf)库,可以通过以下步骤进行: 1. 首先,确保你已经安装了Protocol Buffers库。可以从https://developers.google.com/protocol-buffers/下载并安装最新版本。 2. 在你的Qt项目创建一个.proto文件,用于定义你的消息结构。例如,创建一个名为message.proto的文件,并在其定义你的消息格式,如下所示: ```protobuf syntax = "proto3"; package mypackage; message MyMessage { string name = 1; int32 age = 2; } ``` 3. 使用Protocol Buffers编译器将.proto文件编译成对应的C++代码。打开命令行终端,并导航到包含.proto文件的目录,然后执行以下命令: ``` protoc --cpp_out=. message.proto ``` 这将生成一个名为message.pb.h和message.pb.cc的文件,包含了你的消息的C++定义。 4. 在你的Qt项目创建一个新的类,用于使用protobuf消息。例如,创建一个名为MyMessageHandler的类,并在其添加以下代码: ```cpp #include "message.pb.h" class MyMessageHandler { public: void processMessage(const std::string& data) { MyMessage message; message.ParseFromString(data); // 处理消息 qDebug() << "Name: " << QString::fromStdString(message.name()); qDebug() << "Age: " << message.age(); } }; ``` 5. 在你的Qt项目使用protobuf消息。例如,在你的Qt应用程序的某个地方,可以这样使用MyMessageHandler类: ```cpp MyMessageHandler handler; // 假设你从网络或其他来源接收到了一段数据 std::string receivedData = ...; handler.processMessage(receivedData); ``` 这样,你就可以在Qt使用Protocol Buffers库来处理和解析protobuf消息了。记得在编译时链接Protocol Buffers库,并将生成的.pb.cc文件添加到Qt项目

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值