QT-MQTT交叉编译(目标机环境:Arm-32位)

一、目标机环境

Linux version 5.10.66  (arm-rockchip830-linux-uclibcgnueabihf-gcc (crosstool-NG 1.24.0)

二、QT-MQTT源码下载

GitHub - qt/qtmqtt: Qt Module to implement MQTT protocol version 3.1 and 3.1.1 http://mqtt.org/Qt Module to implement MQTT protocol version 3.1 and 3.1.1 http://mqtt.org/ - qt/qtmqtticon-default.png?t=N7T8https://github.com/qt/qtmqtt

三、交叉编译

根据本地交叉编译的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

### QtMQTT交叉编译指南 对于嵌入式系统的开发而言,Qt 提供了一套强大的工具集来构建图形界面应用程序。当涉及到网络通信协议如MQTT时,开发者可以利用Qt的灵活性来进行集成[^1]。 #### 准备工作环境 为了实现QtMQTT库在目标平台上的交叉编译,首先要设置好主端的工作环境。这通常意味着安装必要的依赖项以及配置适合特定硬件架构的工具链。例如,在Linux环境下可能需要通过包管理器获取gcc-arm-linux-gnueabi等相关软件包。 #### 获取源码并打补丁 下载官方发布的Qt版本和Paho-MQTT C/C++客户端库源代码。如果存在针对所选处理器体系结构优化过的补丁文件,则应将其应用到这些项目的副本上以确保最佳性能表现。 #### 配置Qt进行交叉编译 编辑`qtbase/mkspecs/devices/linux-arm-generic-g++/qmake.conf`或其他对应于目的设备类型的mkspec目录下的配置文件,调整其中定义的一些宏变量以便适应新的编译需求。比如指定正确的CROSS_COMPILE前缀、SDK路径等参数: ```bash # 修改后的 qmake.conf 示例片段 include(../../common/g++.conf) QMAKE_CC = arm-linux-gcc QMAKE_CXX = arm-linux-g++ ... ``` #### 构建过程中的注意事项 启动实际编译流程之前,请确认已经正确设置了环境变量QTDIR指向本地解压出来的Qt源树根目录;同时也要保证PATH里包含了外部链接器(ld)所在的绝对置。接着运行configure脚本指明要启用哪些模块(含network)、禁用不必要的特性,并最终执行make命令完成整个工程的整体组装操作。 #### 编译 Paho MQTT 库 同样地,切换至pahomqttcpp项目所在的置,按照README.md文档指示调用cmake . -DCMAKE_TOOLCHAIN_FILE=... 来设定cross-compiling选项,随后再做一次完整的build动作即可获得静态或共享形式的目标二进制产物。 #### 测试验证阶段 最后一步是在真实板卡上面加载生成好的可执行程序及其关联资源文件,借助串口调试线缆观察日志输出情况从而判断是否成功建立了TCP连接并向远程服务器发送订阅请求消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值