Qt MinGW版编译使用protobuf

MinGW编译protobuf,并在Qt中使用


    protobuf是一个很好的序列化工具, 因为其二进制序列化,确保了数据传输的保密性和占用带宽小的特性,并且数据结构前后兼容。用来保存数据和传输数据都是非常不错的选择。Qt是非常优秀的跨平台UI框架,特别是其Qt Quick框架在移动平台的渲染效率相当不错,C++和QML结合的开发方式可以提高不少开发效率。

环境: Win7  x64
         Qt5.7 forWindows MinGW版 
         protobuf-cpp-3.3.0.zip
         

一、编译protobuf

    Qt使用protobuf有2种办法, 一种是直接用Qt编译protobuf的源码, 但这种方式各种报错,路途艰辛,GitHub上有别人做好的Qt项目但是版本较老,我用Qt5.7编译报错。另外就是用MinGW编译protobuf源码了,这个方法比较简单,容易成功。

1 下载安装CMake ,安装的时候选择添加环境变量, 我下载的版本cmake-3.9.0-rc5-win64-x64.msi

2 下载安装MinGW, (Qt 5.7自带的MinGW版本为5.3.0, 因此下载5.3.0的版本,避免不必要的麻烦) 进官网https://sourceforge.net/projects/mingw/files/点击"Download mingw-get-setup.exe (86.5 kB)" 下载完双击.exe文件安装,点击basic setup,然后依次右键单击,选择Mark for installation, 一定要勾选msys。然后点击菜单栏installation->Apply changes。安装过程比较慢,请耐心等待。安装完成后如下图所示。


  安装完成后,将c:\minGW\bin和c:\minGW\msys\1.0\bin添加到系统变量里。


3 下载protobuf, 源代码包没有configure脚本,所以下载release版的源码包,地址:https://github.com/google/protobuf/releases
  
  我下载的版本protobuf-cpp-3.3.0.zip, 下载完成后解压,我的路径是C:\XXXXX\QtProtobuf\protobuf-cpp-3.3.0\protobuf-3.3.0
  

4 进入MinGW安装路径 C:\MinGW\msys\1.0,  双击msys.bat运行终端
  
  

在终端里进入之前一步解压的protobuf路径, 能看到如下所示的文件:
  
 
 输入
 ./configure
  make
  开始编译

  编译过程中出现: 错误"'strdup' was not declared in this scope "
  
  原因是strdup属于GNU C++的函数, 不是标准(std)C++的函数, 把Makefile中的"-std=C++11"修改为"-std=gnu++0x", 即可.
  打开源码目录src文件夹, 打开Makefile文件
  其中有2行(1080,1081行)
  CXX = g++ -std=C++11
  CXXCPP = g++ -E -std=C++11
  修改为
  CXX = g++ -std=gnu++0x
  CXXCPP = g++ -E -std=gnu++0x
  
  再次执行
  make
  make install

  不出意外编译OK   
  安装的库和头文件在C:\MinGW\msys\1.0\local内
 

二、 Qt 5.7 使用 protobuf库

   1 新建Qt 控制台工程 
  在项目文件.pro中添加如下行
  INCLUDEPATH += C:\MinGW\msys\1.0\local/include
  LIBS += -L C:\MinGW\msys\1.0\local/lib -lprotobuf


   2 编写一个简单的proto文件 config.proto, 内容如下
      
syntax = "proto3";  
package config;   
message VoiceConfig{  
  int32 sample_rate = 1;  
  int32 mic_num = 2;  
  string voiceserver_address = 3;  
  int32 wakeup_sensitivity = 4 ;  
  int32 bargein_sensitivity = 5;  
  int32 audo_outtype = 6;  
}  

      打开msys终端,进入config.proto这个文件的路径
      执行 protoc --cpp_out=. config.proto , 会在当前路径下生成两个文件config.pb.h, config.pb.cc 。将这两个文件加入Qt工程.






2 在man函数中加入如下内容, 
#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <string>

#include <config.pb.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    config::VoiceConfig vc;

    QString ipaddr="192.168.0.136";

    std::string s = ipaddr.toStdString();

    vc.set_sample_rate(32000);
    vc.set_allocated_voiceserver_address(&s);
    vc.set_wakeup_sensitivity(50);
    vc.set_bargein_sensitivity(50);
    vc.set_audo_outtype(1);

    std::string sdata="";
    vc.SerializeToString(&sdata);

    qDebug()<<"size:"<<sdata.size();

    config::VoiceConfig de;

    de.ParseFromString(sdata);
    qDebug()<<"sample_rate:"<<de.sample_rate();
    qDebug()<<"address:"<<QString::fromStdString(de.voiceserver_address());
    qDebug()<<"wakeup_sensitivity:"<<de.wakeup_sensitivity();

    return a.exec();
}


  点击编译
  
  
  编译成功但是运行报错During startup program exited with code 0xc0000135
   
  这是因为用到了外部的dll库,lib库是以动态链接方式添加到了.pro文件的(可以静态链接到.pro),所以编译时不会出错,但是运行的时候就会报错
  需要把dll库拷贝到程序执行路径,
  拷贝C:\MinGW\msys\1.0\local\bin\libprotobuf-13.dll 到 程序执行路径XXXXXX/debug
  再次运行OK, 如下:





  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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项目中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值