天天看點

界面開發:如何使用交叉編譯器在Visual Studio中建立Qt Quick應用程式

Qt是一個跨平台架構,通常用作圖形工具包,它不僅建立CLI應用程式中非常有用。而且它也可以在三種主要的桌上型電腦作業系統以及移動作業系統(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式裝置,Android(Necessitas)和iOS的端口上運作。現在我們為你提供了免費的試用版。

Qt Visual Studio工具現在支援 Qt項目的交叉編譯。由于Qt / MSBuild和Linux開發VS工作負載的內建,使其成為可能。在本文中,我們将展示如何使用此功能在Visual Studio中通過Qt Quick建立嵌入式應用程式。

我們将開發用于在鏡像螢幕上顯示公共資訊的應用程式。這些是在休息區,洗手間等安裝的一部分。該應用程式将在嵌入式Linux的裝置上運作。在本文中,我們将使用運作Raspbian(Buster)的Raspberry Pi 3 ModelB。

界面開發:如何使用交叉編譯器在Visual Studio中建立Qt Quick應用程式

我們在目标裝置上運作Qt Quick嵌入式應用程式

準備開發環境

開發主機将是Windows 10計算機。必須安裝Visual Studio 2019,包括桌面開發和Linux開發工作負載。

界面開發:如何使用交叉編譯器在Visual Studio中建立Qt Quick應用程式

所需的Visual Studio工作負載

我們将在Windows Linux子系統(WSL)的執行個體中運作交叉編譯器。設定開發環境的下一步是啟用WSL并安裝Linux發行版。然後應該可以打開終端視窗并運作Linux指令。

user@buildhost:~$ uname -srvo
Linux 4.4.0-18362-Microsoft #836-Microsoft Mon May 05 16:04:00 PST 2020 GNU/Linux
user@buildhost:~$      

WSL中的指令行外殼

要使用Qt Visual Studio工具,必須至少有一個Windows版Qt安裝可用。出于測試目的,這還将允許在開所發的應用程式上運作。

界面開發:如何使用交叉編譯器在Visual Studio中建立Qt Quick應用程式

開發環境概述

交叉編譯Qt

現在,我們可以繼續設定交叉編譯器。我們可以安裝預建構的工具鍊,也可以編譯自己的工具鍊。如果一切順利,那麼我們應該能夠在裝置上運作一個簡單的程式。

user@buildhost:~$ echo "#include " > main.cpp
user@buildhost:~$ echo "int main() {" >> main.cpp
user@buildhost:~$ echo "std::cout << \"Hello World from Raspberry Pi\\n\";" >> main.cpp
user@buildhost:~$ echo "return 0;" >> main.cpp
user@buildhost:~$ echo "}" >> main.cpp
user@buildhost:~$ /opt/cross-pi-gcc-8.3.0/bin/arm-linux-gnueabihf-g++ main.cpp
user@buildhost:~$ scp a.out [email protected]:/home/pi
[email protected]'s password:
a.out    100% 12KB 218.1KB/s 00:00
user@buildhost:~$ ssh [email protected] ./a.out
[email protected]'s password:
Hello World from Raspberry Pi
user@buildhost:~$      

在Raspberry Pi上運作“ Hello World”

我們準備為Raspberry Pi建構Qt。為此,我們将遵循“spberryPi2EGLFS — A modern guide for cross-compiling Qt for HW accelerated OpenGL with eglfs on Raspbian and setting up Qt Creator”教程。建構完成後,我們應該能夠在Raspberry Pi上運作示例Qt應用程式。

user@buildhost:~$ echo "#include " > main.cpp user@buildhost:~$ echo "int main() {" >> main.cpp user@buildhost:~$ echo "qInfo() << \"Hello World with Qt version\" << qVersion();" >> main.cpp user@buildhost:~$ echo "return 0;" >> main.cpp user@buildhost:~$ echo "}" >> main.cpp user@buildhost:~$ echo "SOURCES += main.cpp" > hello.pro user@buildhost:~$ raspi/qt5/bin/qmake user@buildhost:~$ make -s user@buildhost:~$ scp hello [email protected]:/home/pi [email protected]'s password: hello 100% 12KB 359.6KB/s 00:00 user@buildhost:~$ ssh [email protected] ./hello [email protected]'s password: Hello World with Qt version 5.12.9 user@buildhost:~$
user@buildhost:~$ echo "int main() {" >> main.cpp
user@buildhost:~$ echo "qInfo() << \"Hello World with Qt version\" << qVersion();" >> main.cpp
user@buildhost:~$ echo "return 0;" >> main.cpp
user@buildhost:~$ echo "}" >> main.cpp
user@buildhost:~$ echo "SOURCES += main.cpp" > hello.pro
user@buildhost:~$ raspi/qt5/bin/qmake
user@buildhost:~$ make -s
user@buildhost:~$ scp hello [email protected]:/home/pi
[email protected]'s password:
hello 100% 12KB 359.6KB/s 00:00
user@buildhost:~$ ssh [email protected] ./hello
[email protected]'s password:
Hello World with Qt version 5.12.9
user@buildhost:~$      
設定Qt Visual Studio工具      

要從IDE 安裝Qt Visual Studio工具,請打開Extensions > Manage Extensions。搜尋“ qt”:結果應顯示“ Qt Visual Studio Tools”擴充名;選擇它,然後按“下載下傳”。關閉VS,然後按照安裝說明進行操作。重新打開VS後,Qt Visual Studio工具應該可用。

界面開發:如何使用交叉編譯器在Visual Studio中建立Qt Quick應用程式

Qt Visual Studio工具菜單

要使用Qt Visual Studio Tools,我們必須首先注冊将要使用的Qt版本。我們将從為Windows注冊Qt開始。

  • 打開“Qt VS Tools > Qt Options”,然後在“ Qt版本”頁籤上按“Add”。
  • 提供名稱和Qt安裝的路徑。
界面開發:如何使用交叉編譯器在Visual Studio中建立Qt Quick應用程式

在Qt VS工具中注冊Windows版Qt

現在,我們将注冊駐留在WSL執行個體中的Qt的交叉編譯版本。

  • 再次在“ Qt版本”頁籤上按“add”以打開“Add New Qt Version”對話框。
  • 将“Build Host”設定為“ Linux WSL”。(如果我們使用的是實體建構主機,而不是通過WSL使用虛拟建構主機,則可以選擇“ Linux SSH”。)
  • 提供Qt安裝的名稱和路徑,以及要使用的編譯器(預設為g ++)。在這裡,我們将提供交叉編譯器的路徑。
界面開發:如何使用交叉編譯器在Visual Studio中建立Qt Quick應用程式

為Raspberry Pi注冊Qt版本

建立一個多平台的Qt Quick項目

在注冊了将要使用的Qt版本之後,我們現在可以建立一個Qt項目。

  • 選擇“ File > New > Project”以打開“ Visual Studio”對話框以建立新項目
  • 在項目模闆搜尋中輸入“ qt”,然後選擇“ Qt Quick Application”
  • 按“Next”;提供項目的名稱和位置,然後按“Create”。
  • “Qt Quick Application Wizard”對話框将打開。按“Next >>”進行配置設定。
  • 為Windows和Qt的Raspberry Pi版本添加項目配置。
界面開發:如何使用交叉編譯器在Visual Studio中建立Qt Quick應用程式

新項目配置

按“Finish”以完成項目建立向導。Visual Studio現在應該顯示新的多平台Qt Quick項目。選擇Windows配置,然後按F5鍵建構并運作該應用程式。然後應打開帶有“ Hello World”标題的空視窗。

使用WSL在Visual Studio中交叉編譯

使用WSL執行個體運作交叉編譯器比使用SSH連接配接到建構主機更快。使用SSH時,MSBuild必須首先将源檔案上傳到遠端主機。另一方面,WSL将在中安裝本地驅動器/mnt,進而使檔案通路瞬間完成。在這種情況下,MSBuild将Windows路徑映射到根于的相應Linux路徑/mnt,例如:

  • C:\include\foolib maps to /mnt/c/include/foolib ✔️

MSBuild将假定屬性頁中提供的路徑是本地路徑,并将它們映射到/mnt。在屬性頁中使用絕對Linux路徑時,這可能導緻錯誤的映射,例如:

  • /home/user/raspi maps to /mnt/home/user/raspi ❌

為了避免這個問題,我們将在/mnt中建立指向WSL執行個體檔案系統中其他頂層目錄的符号連結。

user@buildhost:/mnt$ sudo ln -s /home home
user@buildhost:/mnt$ ls -go
total 0
drwxrwxrwx 1 4096 Sep 1 15:29 c
drwxrwxrwx 1 4096 Sep 1 15:29 d
drwxrwxrwx 1 4096 Sep 1 15:29 e
lrwxrwxrwx 1 5 Sep 1 17:10 home -> /home
user@buildhost:/mnt$      

在中建立符号連結 /mnt

現在,我們可以交叉編譯該項目了。選擇一個Linux配置,然後按F7鍵開始建構。

1>------ Rebuild All started: Project: QuickMirror, Configuration: Release_RPi x64 ------
1>Invoking 'mkdir -p $(dirname /mnt/c/Users/user/Source/Repos/QuickMirror/obj/x64/Release_RPi/qmake/temp/props.txt); mkdir -p /mnt/c/Users/user/Source/Repos/QuickMirror/obj/x64/Release_RPi/qmake/temp; cd /mnt/c/Users/user/Source/Repos/QuickMirror/obj/x64/Release_RPi/qmake/temp; ("/home/user/raspi/qt5/bin/qmake" -query) 1> props.txt', working directory: '/mnt/c/Users/user/Source/Repos/QuickMirror'
1>Reading Qt configuration (/home/user/raspi/qt5/bin/qmake)
1>Invoking 'mkdir -p $(dirname /mnt/c/Users/user/Source/Repos/QuickMirror/obj/x64/Release_RPi/qmake/temp/qtvars.pro); mkdir -p $(dirname /mnt/c/Users/user/Source/Repos/QuickMirror/obj/x64/Release_RPi/qmake/temp/Makefile); mkdir -p $(dirname /mnt/c/Users/user/Source/Repos/QuickMirror/obj/x64/Release_RPi/qmake/temp/qtvars.log); mkdir -p /mnt/c/Users/user/Source/Repos/QuickMirror/obj/x64/Release_RPi/qmake/temp; cd /mnt/c/Users/user/Source/Repos/QuickMirror/obj/x64/Release_RPi/qmake/temp; ("/home/user/raspi/qt5/bin/qmake" "CONFIG -= debug release debug_and_release" "CONFIG += release" qtvars.pro) 1> qtvars.log 2>&1', working directory: '/mnt/c/Users/user/Source/Repos/QuickMirror'
1>rcc qml.qrc
1>Invoking 'mkdir -p $(dirname qml.qrc); mkdir -p $(dirname /mnt/c/Users/user/Source/Repos/QuickMirror/main.qml); mkdir -p $(dirname /mnt/c/Users/user/Source/Repos/QuickMirror/obj/x64/Release_RPi/rcc/qrc_qml.cpp); (/home/user/raspi/qt5/bin/rcc /mnt/c/Users/user/Source/Repos/QuickMirror/qml.qrc --name qml -o /mnt/c/Users/user/Source/Repos/QuickMirror/obj/x64/Release_RPi/rcc/qrc_qml.cpp)', working directory: '/mnt/c/Users/user/Source/Repos/QuickMirror'
1>Starting remote build
1>Compiling sources:
1>main.cpp
1>qrc_qml.cpp
1>Linking objects
1>QuickMirror.vcxproj -> C:\Users\user\Source\Repos\QuickMirror\bin\x64\Release_RPi\QuickMirror.out
1>Done building project "QuickMirror.vcxproj".
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========      

VS中的交叉編譯Qt項目

接下來

  • 部署和運作應用程式
  • QML中的應用程式代碼
  • 在目标裝置中調試

繼續閱讀