centos下基于Qt5.12.1的mqtt编译及示例
前言
Qmqtt是对mqtt协议的一个轻量级实现,在qt5.10之后,纳入qt官方支持,但是在开源免费的qt版本中并不发布该库,因此需要手动的对Qmqtt库进行编译、安装,然后才能使用。
编译过程中遇到很多小问题,一一解决并记录了下来。
- qt版本选择。从最开始的qt5.6,升为qt5.13.1,发现该版本以取消了mysql驱动库的发布,需要自行编译,在centos下涉及到mysql安装、qt源代码安装等系列操作,因此降级为Qt5.12.0。在运行程序的时候,发现该版本的qt在QCoreApplication工程下使用gcc4.8存在编译bug,遂最终确定qt版本为Qt5.12.1。
- qmqtt代码版本的选择。 因为qt版本众多,所以与之适配的qmqtt库也存在众多分支,此处选择的是5.12版本
- qmqtt编译问题。在qmqtt的编译过程中,遇到编译器报错:unrecognized command line option ‘-Wdate-time’。经查是因为gcc版本过低,所以进行了centos7下的gcc升级,从4.8升级为gcc5.4。
gcc5.4的安装
安装gcc
yum install gcc -y
安装g++
yum install gcc-c++ -y
下载gcc-5.4.0安装包,该过程较长,可手动使用浏览器下载。
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-5.4.0/gcc-5.4.0.tar.bz2
解压
tar -xvf gcc-5.4.0.tar.bz2
下载编译依赖项,很慢,只能等待。
cd gcc-5.4.0
./contrib/download_prerequisites
建立编译输出目录
mkdir build
cd build
生成Makefile文件
../configure -prefix=/usr/local --enable-checking=release --enable-languages=c,c++ --disable-multilib
开始编译,持续时间较长,编译完成进行安装
make
make install
重建软连接
cd /usr/bin/
mv gcc gcc_back
mv g++ g++_back
ln -s /usr/local/bin/gcc gcc
ln -s /usr/local/bin/g++ g++
替换老的依赖库:
find / -name "libstdc++.so*"
得到下图,高亮部分为新库:
重建软链接
cp /gcc-5.4.0/build/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21 /usr/lib64
rm -rf libstdc++.so.6
ln -s libstdc++.so.6.0.21 libstdc++.so.6
重启,安装升级完毕。
Qmqtt 安装编译
下载
git clone git://code.qt.io/qt/qtmqtt.git
然后checkout到5.12版本,然后运行如下命令
/opt/Qt5.12.1/5.12.1/gcc_64/bin/qmake
make
make install
此时已经安装成功,在/opt/Qt5.12.1/5.12.1/gcc_64/lib目录下就可以看到编译好的库了。
使用时只需要在工程文件下添加:
QT += mqtt
就可以正常使用Qmqtt库了。
Qmqtt的demo实例
此处仅研究QmqttClient的使用,例子参见代码中自带的Examples目录,在其中选择simpleclient工程编译运行,实现了基本的连接、订阅、发布消息功能。效果如下:
注意
在使用的过程中,发现如果QmqttClient对象是在主线程中创建,在子线程中发送消息时,会报错:QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
但是如果在子线程内创建QmqttClient对象并发送消息,会提示一直在连接中,始终未能连接成功。
那么只能在主线程中创建对象,在主线程中发送消息。消息内容从其他子线程通过信号槽返回到主线程即可。