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. 【Ray Tracing in One Weekend 超详解】 光线追踪1-2

    今天我们开始进入正篇 Chapter 3: Rays, a simple camera, and background 对于所有的光线追踪器,基本都有一个光线类,计算沿光线看到的颜色. 我们的光线是一 ...

  2. codevs 2821 天使之城

    题目描述 Description 天使城有一个火车站,每辆火车都从A方向驶入车站,再从B方向驶出车站. 为了调度火车,火车站设有停放轨道,可存放5辆火车.已知从A进入车站顺序为1.2.3…….现在给你 ...

  3. Codeforces Round #374 (Div. 2) B. Passwords 贪心

    B. Passwords 题目连接: http://codeforces.com/contest/721/problem/B Description Vanya is managed to enter ...

  4. Linux学习笔记03—初识Linux

    命令介绍 忘记root密码的处理方法 系统安装盘的救援模式的使用 一.命令介绍 1.LS命令 ls 查看当前目录下的文件 Ls –l 等同于ll 查看目录的详细信息 Ls –a 查看当前目录下的所有文 ...

  5. API测试利器postMan 使用教程

    自从开始做API开发之后,我就在寻找合适的API测试工具.一开始不是很想用Chrome扩展,用的 WizTools 的工具,后来试过一次 Postman 之后就停不下来了,还买了付费的Jetpacks ...

  6. 使用Puppeteer进行数据抓取(四)——图片下载

    大多数情况下,图片获取并不是很困难的事情,获取图片的url,然后模拟浏览器请求即可.但是,有的时候这种方法往往无法生效,常见的情形有: 动态图片,每次获取都是一个新的,例如图片验证码,重新获取时是一个 ...

  7. 【Go命令教程】10. go fix 与 go tool fix

    命令 go fix 会把指定 代码包 的所有 Go 语言源码文件中的旧版本代码修正为新版本的代码.这里所说的版本即 Go 语言的版本.代码包的所有 Go 语言源码文件不包括其子代码包(如果有的话)中的 ...

  8. java系列之 原生数据类型

    在我看来,java里面里面除了原生类型不是对象,其他的都是对象.但java是面向对象的语言,很多地方还要要操作对象,所以java会自动把原生类型转为对应的包装类型.这个过程叫自动装箱.有装箱就有拆箱, ...

  9. man命令使用

    如:man 2 read, 就可以查看read函数的文档

  10. C#访问远程主机资源的方法,多种方式

    最近要实现访问远程主机的共享目录中的一个文件.遇到了权限问题.google了一下,找到了几种解决方法,记录如下: 一.调用Net use命令 // 使用方法:        //if (Connect ...