QT中使用MinGW 编译的protobuf库--包含库的生成和使用

0前言

最近要在QT中使用protobuf,于是需要编译protobuf静态库文件,导入qt使用,没想到过程非常曲折,各种报错各种坑,在网上参考了很多文章,最后终于成功了,现在将QT中使用protobuf的整个配置过程都写出来提供给大家,希望能够帮助到大家。

1准备工作

1.1 下载QT并安装
下载QT5.6.0,到D盘的QT文件夹,并且加入系统环境变量
D:\Qt\Qt5.6.0\Tools\mingw492_32\bin;D:\Qt\Qt5.6.0\5.6\mingw49_32\bin;D:\Qt\Qt5.6.0\Tools\mingw492_32\i686-w64-mingw32\bin
1.2 下载cmake3.11.0并安装
在https://cmake.org/download/中下载Cmake
安装到D:\anzhuangbao\cmake-3.11.0-rc1-win32-x86
加入系统环境变量
;D:\anzhuangbao\cmake-3.11.0-rc1-win32-x86\cmake-3.11.0-rc1-win32-x86\bin
1.3 下载protobuf3.3.0的源码
在https://github.com/google/protobuf/releases中下载3.3.0的源码,如图所示

就是protobuf-cpp-3.3.0.zip
下载到D盘根目录,解压。

2生成protobuf库文件

2.1 CMAKE的设置与库的生成
打开cmake软件,选择编译的源为protobuf源码中的cmake文件夹,之后在D盘根目录下建立输出目录,为output330,设置为目标文件夹,如图所示。

然后点击configure按键,选择MinGW编译,默认的编译器即可,也就是QT自带的编译器,这样比较保险,如果本机还有别的MinGW版本,建议不要选,就选QT自带的编译器即可,如图所示。


点击finish按键,开始配置。配置结束后,点击Grouped和Advance


点开protobuf列表,只勾选一个MSVC_STATIC_RUNTIME,如下图所示。


点击Generate生成,如图所示。


生成结束后,我们发现output330文件夹中出现了makefile文件,如图所示。


打开cmd,进入output330文件夹,输入mingw32-make命令,开始编译源代码,如下图所示。


等待几分钟编译结束。


编译结束后,我们打开output330文件夹可以看到生成的库文件和protoc.exe。如下图所示。


如果没有生成protoc.exe,则可以到刚才https://github.com/google/protobuf/releases中下载protoc-3.3.0-win32.zip,bin文件中就是这个exe.

2.2 proto.cpp和.h的生成
在D盘根目录下新建一个文件testData.proto,后缀名为.proto,在文件中输入代码如下:

syntax = "proto3";
package config;
message VoiceConfig{
int32 sample_rate = ;
int32 mic_num = ;
}


将之前生成的protoc.exe拷贝到C:\windows\system32中,并重命名为protoc330.exe,如图所示。


打开cmd,进入D盘根目录,也就是testData所在目录,输入如下命令,可在目录中生成.cpp和.h文件。

至此,库文件和源文件,头文件都生成完毕了。

3在QT中测试protobuf的使用

3.1 建立工程,配置.pro
建立QT控制台工程,导入生成的.cpp和.h文件,打开.pro文件,配置如下:

3.2 编写代码测试
在main中输入如下代码,测试结果如下图所示。

#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();
vc.set_allocated_voiceserver_address(&s);
vc.set_wakeup_sensitivity();
vc.set_bargein_sensitivity();
vc.set_audo_outtype(); 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();
}


代码中将数据结构中的两个变量赋值为7,9,做了序列化和反序列化,解析后数据打印为7,9说明protobuf在QT中使用成功!

4结语

前前后后花了四天时间才搞定QT的protobuf,中间踩了很多坑,有人说必须动态编译,还有的说要下载msys来编译,中间浪费了很多时间,以上是我亲自测试总结的方法,希望大家能用上,最后,我将已经编译好的protobuf3.3.0的库文件和protoc.exe打包上传,需要的可以直接下载使用,https://download.csdn.net/download/f1jiaziqing2/10759471 免去了编译的步骤。

QT中使用MinGW 编译的protobuf库--包含库的生成和使用的更多相关文章

  1. 在Windows中使用MinGW编译X264

    转自:http://www.cnblogs.com/xiongjiaji/archive/2012/06/08/2541265.html 参考:http://ayobamiadewole.com/Bl ...

  2. Qt中添加OpenCV库

    配置在Qt中的OpenCV,看了很多“教程”,最终成功.记一下过程. 本机配置: window7 32位系统: qt-opensource-windows-x86-mingw492-5.5.1: Op ...

  3. Windows下编译Google.Protobuf在Qt(C++)中使用与Unity3d(C#)交互

    1.首先从Github-Protobuf下载代码,本文下载的版本号是3.1.0. 2.仔细查看各个README,有相关的资源下载和编译说明. 3.在一个方便的地方创建一个Install类型的文件夹,放 ...

  4. QT 编译遇到重定义;不同的基类型&在QT中使用C++ lib库

    最近在使用osg和qt开发,在集成osg时候因为我使用的qt版本为非opengl的版本,导致qt自己封了一遍opengl的一些基类变量如double 这时候就会跟osg中声明的opengl的类型冲突, ...

  5. Qt中加载Libevent静态库(通过reimp和rs两条语句将lib转为a)

    文章来源:http://blog.sina.com.cn/s/blog_731bf4c90102wnpr.html 本文仅是个人经验总结,若有错误欢迎指教! 最近要做一个跨平台的项目,同时也涉及到网络 ...

  6. linux下编译qt5.6.0静态库(使用./configure --help来看看都有哪些参数。超详细,有每一个模块的说明。如果改变了安装的目录,需要到安装目录下的bin目录下创建文件qt.conf)(乌合之众)good

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  7. Qt之CMake和MinGW编译OpenCV

    这里编译的是最新版OpenCV3.4.3,编译过程比较曲折,大部分编译错误都可以查得到解决方法,也遇到了Google无果的错误,好在最后还是解决了,特此记录. 编译环境 win10-64bit Qt5 ...

  8. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...

  9. QT中静态库的生成与使用

    一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...

随机推荐

  1. mini-css-extract-plugin简介

    将css单独打包成一个文件的插件,它为每个包含css的js文件都创建一个css文件.它支持css和sourceMaps的按需加载. 目前只有在webpack V4版本才支持使用该插件 和extract ...

  2. 日志回滚:python(日志分割)

    日志回滚:python 什么是日志回滚? 答: 将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会越来越庞大,进而影响系统的性能.因此,有必要对日志文件按某种条件进行切分,要切分日 ...

  3. [转]C++ template —— 模板基础(一)

    <C++ Template>对Template各个方面进行了较为深度详细的解析,故而本系列博客按书本的各章顺序编排,并只作为简单的读书笔记,详细讲解请购买原版书籍(绝对物超所值).---- ...

  4. 3D游戏开发之UE4中的集合:TSet容器

    好久没有更新了,最近一直在老家过年,网络不通的,今天才有时间更新一集. 一.TSet<T>是什么 UE4中,除了TArray动态数组外,还提供了各种各样的模板容器.这一节,我们就介绍集合容 ...

  5. OpenVPN选项topology subnet实现子网掩码24的子网地址扩展

    首先,在国内的文章中都没有提及这个概念,到时很多人生成的VPN服务端配置分配的IP都采用net30这种形式,这就导致了在任何一台VPN客户端上无法实现路由指向,因为子网掩码30换算出来就两个地址. t ...

  6. [原创]SpotLight性能监控工具使用介绍

    [原创]SpotLight性能监控工具使用介绍 1  Spotlight工具是什么? SpotLight 是由Quest公司出品的一款第三方性能监控的图形化工具.SpotLight有一些的产品诸如可以 ...

  7. Android学习笔记PreferenceFragment的使用

    相信大家对Perference都比较熟悉了,也就是我们常说的偏好设置,首选项设置,可以保存一些数据,例如我们在上一次使用的时候的一些内容,希望在下一次启动后依然生效,而不需要再进行配置那么麻烦.一般这 ...

  8. swift笔记(二) —— 运算符

    基本运算符 Swift支持大部分的标准C语言的操作符,而且做了一些改进,以帮助开发人员少犯低级错误,比方: 本该使用==的时候,少写了个=, if x == y {-} 写成了 if x = y {- ...

  9. 交叉编译strace

    下载地址:https://sourceforge.net/projects/strace/ 我下的版本是4.18, 也可以到这里下载. 下面是交叉编译用的脚本: #!/bin/bash ../conf ...

  10. Delphi中,除了应用程序主窗口会显示在任务栏上,其它窗口默认都不会显示在任务栏.

    Delphi中,除了应用程序主窗口会显示在任务栏上,其它窗口默认都不会显示在任务栏. Delphi中,除了应用程序主窗口会显示在任务栏上,其它窗口默认都不会显示在任务栏.没有MS开发环境中的ShowI ...