一、目标机环境
Linux version 5.10.66 (arm-rockchip830-linux-uclibcgnueabihf-gcc (crosstool-NG 1.24.0)
二、QT-MQTT源码下载
三、交叉编译
根据本地交叉编译的QT环境来选择QT-MQTT的版本,笔者用的是QT 5.12.9源码库,所以直接选了QT-MQTT 5.15.2,而不是QT-MQTT 6+版本。
$ cd qtmqtt/
$ git checkout v5.15.2
打开 qtmqtt.pro,如果之前交叉编译过QT应用,QT IDE里的编译配置都是正常的。如下图所示:
配置好你想要的build目录后,直接编译。
可能是版本不完全兼容的缘故,编译过程中出现两个语法错误,改之即可:
四、布署QT-MQTT
常用的有三种方式:第一种是直接将QT-MQTT源码植入目标工程,第二种是以模块(Module)的形式将QT-MQTT的头文件及库文件部署至QT源码的交叉编译目录中,第三种是在目标工程中添加QT-MQTT的头文件和库文件。
我们这里使用第二种方式,方便多个目标工程共用。
1.头文件(include)
将qtmqtt/src/mqtt目录内的头文件拷贝至QT源码的交叉编译目录的include下,后者如qt-5.12.9/arm-qt/include/QtMqtt, QtMqtt目录需要自己新建。如下图所示:
注意:最好不要用QT-MQTT编译输出目录下的头文件,理由就不多说了。
2.库文件(lib/so)
将QT-MQTT编译输出目录lib下的四个so文件拷贝至QT源码的交叉编译目录的lib下,后者如qt-5.12.9/arm-qt/lib。如下图所示:
3.模块配置文件(pri)
将QT-MQTT编译输出目录mkspecs\modules下的pri文件(qt_lib_mqtt.pri)拷贝至QT源码的交叉编译目录modules下,后者如qt-5.12.9/arm-qt/mkspecs/modules。如下图所示:
五、测试QT-MQTT
目录工程配置文件(pro)引入mqtt模块
QT += mqtt
头文件包含
#include "qmqttclient.h"
如下图所示:
六、移植QT-MQTT至嵌入式设备(ARM+LINUX)
将QT-MQTT编译输出目录lib下的四个so文件拷贝至嵌入式设备的lib下,后者必须位于系统环境变量下。可用env命令查看环境变量,如下图所示:
七、开发环境更换电脑后的编译错误
主要原因:模块配置文件(qt_lib_mqtt.pri)中的路径配置,是跟编译QT-MQTT的工程环境绑定了,改至布署后的目录环境即可,如下图所示:
修改前:
QT_MODULE_BIN_BASE = /home/xxx/Desktop/project/build/build-qtmqtt-Arm_Qt5_12_9-Release/bin
QT_MODULE_INCLUDE_BASE = /home/xxx/Desktop/project/build/build-qtmqtt-Arm_Qt5_12_9-Release/include
QT_MODULE_LIB_BASE = /home/xxx/Desktop/project/build/build-qtmqtt-Arm_Qt5_12_9-Release/lib
QT_MODULE_HOST_LIB_BASE = /home/xxx/Desktop/project/build/build-qtmqtt-Arm_Qt5_12_9-Release/lib
include(/home/xxx/Desktop/project/build/build-qtmqtt-Arm_Qt5_12_9-Release/mkspecs/modules-inst/qt_lib_mqtt.pri)
QT.mqtt.priority = 1
include(/home/xxx/Desktop/project/build/build-qtmqtt-Arm_Qt5_12_9-Release/mkspecs/modules-inst/qt_lib_mqtt_private.pri)
QT.mqtt_private.priority = 1
修改后:
QT.mqtt.VERSION = 5.12.9
QT.mqtt.name = mqtt
QT.mqtt.module = Qt5Mqtt
QT.mqtt.libs = $$QT_MODULE_LIB_BASE
QT.mqtt.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtMqtt
修改依据:参数同级目录的其它pri文件即可,如qt_lib_sql.pri内容如下:
QT.sql.VERSION = 5.12.9
QT.sql.name = QtSql
QT.sql.module = Qt5Sql
QT.sql.libs = $$QT_MODULE_LIB_BASE
QT.sql.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtSql
QT.sql.frameworks =
QT.sql.bins = $$QT_MODULE_BIN_BASE
QT.sql.plugin_types = sqldrivers
QT.sql.depends = core
QT.sql.uses =
QT.sql.module_config = v2
QT.sql.DEFINES = QT_SQL_LIB
QT.sql.enabled_features = sqlmodel
QT.sql.disabled_features =
QT_CONFIG +=
QT_MODULES += sql