日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

QT MQTT库在win上和linux上的使用

發布時間:2023/12/20 linux 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT MQTT库在win上和linux上的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

QT的兩種MQTT庫

目前QT使用MQTT庫的方法有兩種:

  • 一種為使用官方庫qmqtt: https://github.com/qt/qtmqtt
  • 另一種是為使用EMQX提供的QT庫:https://github.com/emqx/qmqtt

版本差異

兩個版本存在一定差異

  • 官方庫qtmqtt功能比較強,支持MQTT5.0協議,SSL,有比較完整例程提供參考。但是官方庫版本眾多,在github中有32個分支版本,如果QT版本不對應可能會導致一些編譯錯誤,使得編譯無法通過。
  • emqtt庫功能較弱,開發文檔介紹太簡單,在emqtt的github中的Readme文件中簡單介紹了connect,和一些信號和槽。連接服務器只支持IP,使用域名需要自己使用QHostInfo轉化為IP。但是相比官方庫,其編譯簡單,對多個QT版本兼容性較好,方便在不同版本QT使用。此庫同時也支持SSL,但是MQTT5.0還沒有試過是否支持。

Windows下QT使用MQTT庫

在Windows平臺編譯使用官方MQTT的例子已經有博客介紹了,可以參考以下兩個博客:

  • 官方庫qtmqtt編譯使用:https://blog.csdn.net/luoyayun361/article/details/104671603

編譯前需要注意的問題:3、4中的錯誤很可能為編譯了不對應QT版本的Qmqtt庫,可在官方github分支中查找自己QT對應的版本。在這里我使用的是QT5.8.0版本編譯官方庫,所以我使用了最接近QT5.8.0的版本qtmqtt-5.12版本。

按照對應版本的QTMQTT庫進行編譯一般不會出現錯誤,實測完成1、2中的錯誤修改后編譯完成,成功提取lib文件。

  • 其中編譯官方庫需要除了此博客中的注意點以外,還需要注庫的源文件路徑中不能出現中文,否則無法進行編譯。
  • 編譯可能會出錯 QtMqtt/qmqttglobal.h: No such file or directory。

    解決方法為:在QT的安裝目下include文件夾下創建QtMqtt文件夾,例如 Qt\5.8\mingw53_32\include\QtMqtt將源文件src/mqtt下所有.h頭文件添加到我們創建的QtMqtt文件夾。
    問題的主要原因是:編譯器是按照在Qt安裝目錄下搜索的,但我們文件是我們自己隨意放的目錄下的 src\mqtt 路徑下。

    原文:https://blog.csdn.net/qq_39280795/article/details/105455436

  • 編譯可能會出錯 qmqttconnection.cpp:169: error: ‘errorOccurred’ is not a member of ‘QAbstractSocket’

    connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);

    qmqttconnection.cpp 中 168行有這么一句:connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError); 就是這句出了問題。查幫助文檔或者源代碼都可以發現 QAbstractSocket 沒有 errorOccurred 這個 信號。有的那個信號叫:void error(QAbstractSocket::SocketError socketError) 所以要改寫成:connect(socket, static_cast<void(QAbstractSocket::*)(QAbstractSocket::SocketError)> (&QAbstractSocket::error), this, static_cast<void(QMqttConnection::*)(QAbstractSocket::SocketError)>(&QMqttConnection::transportError) );
  • 原文:https://blog.csdn.net/liyuanbhu/article/details/106597506

    4.錯誤qmqttconnection.cpp:1455: error: ‘class QList’ has no member named ‘resize’
    此錯誤為QT6的QMQTT類中成員,使用了QT5編譯,當然無法找到。使用老版本QT需要在github倉庫中選擇對應版本的分支。

    5.編譯運行官方例子simpleclient.pro中出現的問題:error: QMqttClient: No such file or directory此錯誤可以將

    #include <QMqttClient>

    改為

    #include <qmqttclient.h>

    此外還會出現error: QtMqtt/QMqttClient: No such file or directory

    此錯誤可以將

    #include <QtMqtt/QMqttClient>

    改為

    #include <qmqttglobal.h>
    • emqx_mqtt:https://luoyayun361.blog.csdn.net/article/details/104699062 Windows上QT5.8按照此教程沒有出現錯誤。

    Linux下QT使用MQTT庫

    • Linux下官方QTMQTT庫程序從win上可以移植過來,但是注意QT版本不能相差太大,并且lib下dll的文件需要換成.so文件。這就意味著需要將QTMqtt代碼使用Linux上QT的gcc++重新編譯一遍,并且將lib下的dll,.a文件換成linux編譯出的lib。

    1.編譯qtmqtt,勾選release,注意kit套件版本,要和winQT版本對應上,一般ubuntu系統會自帶QT,注意安裝使用配套Win上寫的程序的QT版本。

    2.編譯會出現和Win上同樣的錯誤QtMqtt/qmqttglobal.h: No such file or directory。
    此時可按照win上qtmqtt教程一樣在qt的安裝目錄/opt/Qt5.8.0/5.8/gcc_64/include目錄下新建QtMqtt文件夾,將源碼文件qtmqtt-5.12/src/mqtt中的.h頭文件復制到其中。
    3.再次編譯成功,會在源碼文件夾中找到lib文件夾下的lib文件,替換windows下編好程序的lib庫(.a,.dll文件)。

    4.相比在win上的程序還需在程序的.pro文件中多加入一段else:unix:!macx: LIBS += -L$$PWD/lib/ -lQt5Mqtt

    win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqtt else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqttd else:unix:!macx: LIBS += -L$$PWD/lib/ -lQt5Mqtt INCLUDEPATH += $$PWD/include DEPENDPATH += $$PWD/include

    5.編譯win上移植過來的程序運行成功

    • Linux下emqx的移植,同理與qtmqtt一樣,需要在linux平臺下重新編譯源碼。
      可以看博客:https://blog.csdn.net/wct3344142/article/details/107022706

    總結

    以上是生活随笔為你收集整理的QT MQTT库在win上和linux上的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。