我用STM32MP1做了個疫情監控平臺2—Qt環境搭建

0.系列教程

1.嵌入式Qt簡介

Qt 是一個跨平臺的應用程序開發框架。使用Qt開發的應用程序,只需要編寫一套代碼,然後把這套代碼放在不同平臺的Qt環境去編譯,就會生成可以運行在對應平臺的應用程序。例如,我在Windows寫了一個串口助手,這套代碼不用修改,放在Linux環境下的Qt開發環境,重新編譯,就可以生成可以在Linux環境下運行的串口助手,當然,Qt支持的環境有很多。不同平臺下的移植,只需要修改很小一部分或者不用修改就可以直接運行。
在這裏插入圖片描述
嵌入式Qt,即QtE,屬於Qt Embedded Linux 分支平臺。Qt/E 所面對的硬件平臺較多,當開發人員需要在某硬件平臺上移植 Qt/E 時,需要下載Qt 源代碼,利用交叉編譯器編譯出 Qt 庫。接着需要將 Qt 庫複製兩份,一份放置在開發主機上,供編譯使用;一份放在目標板上,供運行時動態加載使用。

2.查看開發板Qt庫的版本

要想在開發板上運行Qt程序,首先板子的系統要支持Qt圖形庫,而且要確定這個的庫的版本。那麼怎麼看開發板是否支持Qt呢?可以使用find搜索命令,搜索本地所有Qt相關的文件:

#進入到根目錄
cd /

#搜索qt相關的文件
find -name "*Qt*"
#或者
find -name "*qt*"

如果搜索結果有很多so類型的文件,說明這個開發板上的系統是支持Qt的,而且後面的數字就是當前Qt庫的版本號。
在這裏插入圖片描述
可以看出,現在的系統是支持Qt的,庫的版本是5.11.2。

3.主機搭建Qt環境

3.1 安裝桌面版本Qt開發套件

安裝桌面版本的 Qt 開發套件,用戶可以先在 PC 主機上進行 Qt 應用程序的開發和調試,待應用程序完成之後,再使用嵌入式Qt套件構建一下,就可以生成可以在開發板上運行的目標程序。由於開發板上的Qt庫版本是5.11版本的,建議桌面Qt版本儘量也是5.11版本的,如果不一致影響也不大。如果你的電腦上已經安裝了Qt 5 Linux版本,這一節可以跳過。由於我的電腦之前已經安裝了5.8版本的,所以不再重新安裝。

  • 下載 Qt

Qt 安裝包從Qt 5版本開始提供Linux版本的獨立安裝包,而不需要自己編譯。在之前的Qt 4版本,是沒有Linux安裝包的。

官方下載地址:Index of /archive/qt

最好選擇Qt 5.8以上,要選擇Linux版本的,如qt-opensource-linux-x64-5.11.0.run,這個安裝包是桌面Qt程序開發套件,包括qmake、QtCreator等工具。

實測官方下載速度還是非常快的,如果下載速度慢,可以轉到國內的鏡像地址:清華大學Qt下載鏡像地址,下載速度會很快。

  • 安裝 Qt

下載完成之後,直接雙擊安裝就可以了,如果不能安裝嘗試添加可執行權限,或者以sudo權限執行:

#添加可執行權限
sudo chmod +x ./qt-opensource-linux-x64-5.11.0.run

#安裝
sudo ./qt-opensource-linux-x64-5.11.0.run

#安裝路徑可根據需要選擇
#其他選擇默認安裝配置就行了

安裝完成之後:
在這裏插入圖片描述
其中MaintenanceTool是Qt的安裝管理程序,運行這個文件可卸載Qt。

  • 啓動 Qt

安裝完成之後,可以在Ubuntu搜索Qt關鍵字,點擊Qt Creator啓動Qt環境。
在這裏插入圖片描述
你也可以進入到/Qt5.8.0/Tools/QtCreator/bin文件夾去啓動Qt,如果啓動失敗,添加sudo權限試試。
在這裏插入圖片描述

3.2 添加嵌入式Qt構建套件

搭建一個最基本的Qt環境,需要兩個東西:qmake和編譯器。在安裝桌面版本 Qt 時,已經默認添加了桌面環境的Qt構建套件:

  • 桌面版本qmake:Qt5.8.0/5.8/gcc_64/bin/qmake
  • 桌面版本編譯器:ubuntu 自帶的GCC在這裏插入圖片描述
    爲了編譯可以在開發板上運行的Qt程序,我們還需要配置一個開發嵌入式Qt程序的構建套件:
#嵌入式qmake路徑
/opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/bin/qmake

#交叉編譯器路徑:
/opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/bin/arm-openstlinux_eglfs-linux-gnueabi/arm-openstlinux_eglfs-linux-gnueabi-gcc

在這裏插入圖片描述
可以看到嵌入式Qt的版本是5.11.2。知道了qmake和交叉編譯器的路徑,下面我們在桌面版本Qt中添加一個開發套件,用於構建嵌入式Qt程序。

  • 添加交叉編譯器

打開QtCreator之後,點擊菜單欄的工具->選項->構建和運行->編譯器,添加交叉編譯器:

#添加gcc交叉編譯器
名稱:ya157c_gcc
路徑:/opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/bin/arm-openstlinux_eglfs-linux-gnueabi/arm-openstlinux_eglfs-linux-gnueabi-gcc

#添加g++交叉編譯器
名稱:ya157c_g++
路徑:/opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/bin/arm-openstlinux_eglfs-linux-gnueabi/arm-openstlinux_eglfs-linux-gnueabi-g++

#添加gdb調試器
名稱:ya157c_gdb
路徑:/opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/bin/arm-openstlinux_eglfs-linux-gnueabi/arm-openstlinux_eglfs-linux-gnueabi-gdb

在這裏插入圖片描述

  • 添加嵌入式版本qmake
#嵌入式Qt版本的qmake路徑
路徑:/opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/bin/qmake

在這裏插入圖片描述

  • 添加設備
    這一步可省略。
#添加一個通用Linux設備
設備類型:通用Linux
設備名稱:ya157c
主機名稱:192.168.1.136
用戶名:root
密碼:root

在這裏插入圖片描述

  • 添加嵌入式Qt開發套件

以上都是爲了添加開發套件而服務的,開發套件需要指定qmake和編譯器等。新建一個構建套件

名稱:ya157c
設備類型:通用Linux設備
設備:選擇之前添加的ya157c
Sysroot:/opt/st/stm32mp1/2.6-snapshot/sysroots/cortexa7t2hf-neon-vfpv4-openstlinux_eglfs-linux-gnueabi
C編譯器:選擇之前添加的ya157c_gcc
C++編譯器:選擇之前添加的ya157c_g++
調試器:選擇之前添加的ya157c_gdb
Qt版本:選擇之前添加的Qt 5.11.2
Qt mkspec:linux-oe-g++

點擊Apply之後,如果構建套件前面有紅色或黃色的感嘆號,說明構建套件沒有設置成功,需要檢查配置選項。下面,我們來完成第一個Qt應用程序——Hello World。

4.第一個Qt程序——Hello World

嵌入式Qt應用程序的開發,可以完全按照桌面程序的開發流程:新建工程、設計界面和功能、編譯運行。最後使用嵌入式開發套件構建一下,就生成了可以在嵌入式平臺運行的Qt應用程序。

我們來設計一個簡單的界面,程序只顯示一個標籤,標籤的內容是“Hello World”。在PC上運行正確之後,然後使用ya157c開發套件交叉編譯,再把可執行文件傳輸到開發板上運行,整個過程不需要寫一行代碼。

4.1 新建一個工程

  • 新建一個應用程序工程
    在這裏插入圖片描述
  • 輸入工程名稱和保存路徑
    在這裏插入圖片描述
  • 選擇構建套件

就是這個程序在哪些平臺上運行,我們選擇桌面(Desktop Qt 5.8)和開發板(ya157c)這兩個套件,如果只選擇了一個,在開發過程中也可以再添加其他的構建套件。
在這裏插入圖片描述

  • 工程創建
    在這裏插入圖片描述
  • 界面設計
    拖入一個Label,內容是"Hello World",並調整一下字體和佈局。
    在這裏插入圖片描述
    這樣就創建完成了一個最簡單的Hello World應用程序。

4.2 PC運行Qt程序

點擊左下綠色三角符號,構建並運行,實際效果:
在這裏插入圖片描述

4.3 開發板運行Qt程序

桌面版本運行正常之後,點擊左下角電腦標誌,切換爲ya157c構建套件,再點擊底部錘子按鈕,交叉編譯這個工程。
在這裏插入圖片描述
注意,由於這是交叉編譯,所以編譯出來的程序不能在本地 PC 機上運行或調試。因此不能點擊運行按鈕運行程序,也不能點擊調試按鈕調試程序。

如果構建成功,編譯輸出的文件默認在當前工程目錄的上一級。
在這裏插入圖片描述
可以看到,成功輸出了ARM平臺下運行的可執行文件。通過scp或其他方式把文件傳輸到開發板:

#scp傳輸可執行文件到開發板
scp hello_world [email protected]:/home/root

在這裏插入圖片描述
連接HDMI顯示器或RGB顯示屏,我使用的是7寸IPS屏,1024*600分辨率。

開發板運行效果:
在這裏插入圖片描述

5.一些問題

  • 交叉編譯時報錯

桌面Qt套件編譯時,正常。但是使用交叉編譯套件編譯會提示錯誤:
在這裏插入圖片描述
可以通過執行以下命令,複製相應的庫文件:

#切換到庫所在的文件夾
cd /opt/st/stm32mp1/2.6-snapshot/sysroots/cortexa7t2hf-neon-vfpv4-openstlinux_eglfs-linux-gnueabi/vendor/lib/

#複製庫文件
cp -d * ../../lib/

在這裏插入圖片描述
複製完成之後,再編譯就不會報錯了。

  • 液晶屏不能顯示程序界面

如果在運行Qt程序時,出現如下提示:

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
qt.qpa.input: X-less xkbcommon not available, not performing key mapping
Could not queue DRM page flip on screen HDMI1 (Device or resource busy)

或者可以運行,但字體太小了。可以嘗試在運行程序之前,先執行以下命令,再運行Qt程序

psplash-drm-quit
export QT_QPA_EGLFS_ALWAYS_SET_MODE="1"
export QT_QPA_EGLFS_PHYSICAL_WIDTH=150
export QT_QPA_EGLFS_PHYSICAL_HEIGHT=90

其中,150和90是顯示屏的物理尺寸,長150mm,寬90mm。

  • 編譯輸出到當前工程文件夾下

Qt工程編譯輸出的Debug/Release目錄是在當前工程目錄的上一級:

../build-%{CurrentProject:Name}-%{CurrentKit:FileSystemName}-%{CurrentBuild:Name}

可以改爲和工程文件同一目錄下:

./build-%{CurrentProject:Name}-%{CurrentKit:FileSystemName}-%{CurrentBuild:Name}

去掉一個.就好了。
在這裏插入圖片描述
然後關閉工程,刪除工程目錄下的.user文件,重新導入,編譯。
在這裏插入圖片描述
這樣編譯目錄就在工程目錄下了:
在這裏插入圖片描述

我的公衆號:mcu149

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章