環(huán)境:
Ubuntu18.04
開發(fā)板:debian
交叉編譯工具鏈:arm-linux-gnueabihf-gcc 8.3.0
Qt:Qt5.11.2
解決方案在文末,如不想看中間過程,可直接跳轉(zhuǎn)到文末。
mqtt是一種工業(yè)物聯(lián)網(wǎng)協(xié)議,可以用來連接阿里云、百度云、onenet等云端,應(yīng)用廣泛。
關(guān)于mqtt的使用,網(wǎng)上資料主要有以下幾種:
1、STM32+ESP8266:這種方式主要是借助ESP8266模塊來聯(lián)網(wǎng),至于mqtt協(xié)議基本上是要自己實(shí)現(xiàn)的。 也就是mqtt的報(bào)文需要自己去構(gòu)建,好在mqtt的報(bào)文并不是很復(fù)雜,稍微研究一下也能理解。
2、Linux下使用官方sdk包,比如阿里云有提供阿里的sdk包,下載后調(diào)用它提供的接口來連接阿里云。
3、QT里移植mqtt:這種方式因?yàn)榭梢灾苯诱{(diào)用官方寫好的接口,因此使用起來就簡單多了,但是這個(gè)移植過程并不是那么簡單。 這分為Windows端和Linux端。 Windows端就不說了,我主要說一下Ubuntu下和arm開發(fā)板上的移植。
移植也分為兩種,一種是編譯成動(dòng)態(tài)鏈接庫,一種是直接把mqtt官方源碼包含進(jìn)去自己的工程里面,然后一起編譯。 我本人覺得要編譯成庫,然后配置環(huán)境變量什么的比較麻煩,還不如直接把源碼包含進(jìn)去。
先說Ubuntu下的移植:
這個(gè)我是參考網(wǎng)上的,Linux Qt下MQTT模塊的導(dǎo)入(移植)
按照這篇博客來操作,實(shí)測有效,總結(jié)起來非常簡單,就是下載源碼,添加到自己的工程中,然后編譯,編譯出錯(cuò)的都是因?yàn)轭^文件包含的時(shí)候,應(yīng)該把<>替換成"",這兩種頭文件包含的區(qū)別相信大家都很清楚。
這樣就移植好了。 可以看到,在這里使用gcc編譯可以通過,并且寫個(gè)簡單的測試代碼,確實(shí)能連接云端
接下來說一下移植到arm端:
這部分網(wǎng)上的資料是真的少,搜索半天都找不到你想要的。
我們知道,要移植到arm開發(fā)板上面,需要使用交叉編譯工具鏈,正常情況下,你寫好的qt程序在主機(jī)Ubuntu上能運(yùn)行,只要換成交叉編譯工具編譯,就可以放到開發(fā)板上運(yùn)行了。
但是這里你這樣做會(huì)發(fā)現(xiàn)報(bào)錯(cuò)。
提示QSslConfiguration這種類型不認(rèn)識(未定義)。于是我就去找一下這個(gè)在哪里有定義,找了一下,發(fā)現(xiàn)這種類型其實(shí)在qsslconfiguration.h這個(gè)文件中是有定義的,但是前面通過#ifndef QT_NO_SSL這個(gè)宏沒有把這段代碼編譯進(jìn)去
于是真相大白了,在gcc里沒有那個(gè)宏定義,所以下面那段代碼會(huì)被編譯,所以自然就不會(huì)出現(xiàn)未定義這種錯(cuò)誤。但是當(dāng)使用交叉編譯工具鏈的時(shí)候,在qtnetwork-config.h這個(gè)文件中找到了這個(gè)宏定義,所以#ifndef QT_NO_SSL 到#endif之間的代碼都不會(huì)被編譯,自然QSslConfiguration就會(huì)未定義了。
于是我猜想,把qtnetwork-config.h中的這個(gè)QT_NO_SSL宏給注釋掉,應(yīng)該就可以了,雖然 說這樣亂改代碼可能導(dǎo)致一些意想不到的結(jié)果,但我還是想試一下看能不能編譯通過。結(jié)果發(fā)現(xiàn)會(huì)出現(xiàn)一連串的連鎖反應(yīng),改了這個(gè),又會(huì)出現(xiàn)新的錯(cuò)誤,所以這種方法不行。而且像這種文件它默認(rèn)是只讀的,也就是說它本來就不希望你去修改,所以不應(yīng)該這樣做。
后面我又想,既然直接改變宏定義不行,能不能把報(bào)錯(cuò)的地方直接注釋掉,反正那些函數(shù)可能并沒有用到,所以注釋掉應(yīng)該不會(huì)有什么影響
這里是報(bào)錯(cuò)的那個(gè)類的頭文件,再切換到源文件
發(fā)現(xiàn)都是沒有編譯的,但是仔細(xì)觀察源文件,其實(shí)也是有QT_NO_SSL這個(gè)宏的
這里就讓人覺得很奇怪了,同樣是有這個(gè)宏,其他的地方都不會(huì)被編譯,這里卻會(huì)被編譯,而且其他地方都可以跳轉(zhuǎn)到qtnetwork-config.h文件中去,這里卻不會(huì)。
那么,很容易猜到,在這個(gè)源文件里沒有包含qtnetwork-config.h這個(gè)頭文件,導(dǎo)致沒有定義那個(gè)宏。
解決辦法:在qmqtt_ssl_socket_p.h文件中添加一句代碼:
#include "qtnetwork-config.h"
問題成功解決。把編譯好的文件放在arm開發(fā)板上,可以成功執(zhí)行
至此,移植結(jié)束,可以盡情開發(fā)了。
-
Linux
+關(guān)注
關(guān)注
87文章
11511瀏覽量
213815 -
移植
+關(guān)注
關(guān)注
1文章
401瀏覽量
28692 -
Ubuntu
+關(guān)注
關(guān)注
5文章
592瀏覽量
31243 -
工業(yè)物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
25文章
2443瀏覽量
66230 -
MQTT
+關(guān)注
關(guān)注
5文章
682瀏覽量
23720
發(fā)布評論請先 登錄
嵌入式linux部署qt的幾個(gè)疑問
基于QT的嵌入式linux圖形應(yīng)用軟件設(shè)計(jì)
嵌入式Linux下QT移植mqtt的步驟教程
嵌入式Linux系統(tǒng)的移植研究
基于Qt的嵌入式Linux通訊簿程序設(shè)計(jì)
嵌入式linux GUI-Qt解析
基于嵌入式Linux和Qt編程實(shí)現(xiàn)數(shù)碼相框的設(shè)計(jì)
基于嵌入式Linux系統(tǒng)下Mini GUI的移植方法與過程詳解
嵌入式linux安裝qt

嵌入式Linux的QT版本,嵌入式Linux版本Qt5.4快速部署

嵌入式linux安裝qt,嵌入式Linux版本Qt5.4快速部署

嵌入式Linux路線

評論