QT樹莓派交叉編譯環開發環境搭建(附多個exe工具下載連接)

前兩天入手了一塊2.8’的tft液晶顯示屏,因而和樹莓派連了一發,成功將命令行顯示在了這塊小的可憐的屏幕上以後,以爲這屏幕就顯示個黑白內容太浪費了,因而考慮開發一個」臉」(圖形用戶界面,GUI)。首先考慮用C語言或者Python來堆圖形界面,可是發現不論是C語言的圖形庫SDL亦或者OpenGL來堆這貨都有點麻煩,畢竟我也不是想顯示個太過於複雜的圖形界面在那塊屏幕上,只是顯示一個最基本的文字數字就知足了。因而考慮到QT庫。以前曾經學過一段時間的QT For Win32,那個環境很好搭建,從http://www.qt.io上面下載一個安裝包安裝就好了。那時候記得QT好像支持嵌入式的開發,同時在度娘那諮詢到有人曾經在樹莓派上開發了一發QT,可是那個很不幸的是在Startx桌面上跑的,可是我不想跑那個貨,並且他是直接在樹莓派上安裝Qt、編譯、執行的,須要一個絕對足夠分辨率的屏幕,然而我那塊240×320的屏幕顯示個Qt Creator顯然太擠了。。。。。。因而發現網上有人在作Qt的交叉編譯,至於什麼是交叉編譯:html

交叉編譯
簡單地說,就是在一個平臺上生成另外一個平臺上的可執行代碼。一個常常會被問到的問題就是,「既然咱們已經有了主機編譯器,那爲何還要交叉編譯呢?」其實答案很簡單。有時是由於目的平臺上不容許或不可以安裝咱們所須要的編譯器,而咱們又須要這個編譯器的某些特徵;有時是由於目的平臺上的資源貧乏,沒法運行咱們所須要編譯器;有時又是由於目的平臺尚未創建,連操做系統都沒有,根本談不上運行什麼編譯器。
另外一個常常會被問到的問題就是:「既然能夠交叉編譯,那還要主機編譯幹嘛?」其實答案也很簡單,交叉編譯是不得已而爲之!與主機編譯相比,交叉編譯受的限制更多,雖然在理論上咱們能夠作任何形式的交叉編譯,但事實上,因爲受到專利、版權、技術的限制,並不老是可以進行交叉編譯,尤爲是在業餘條件下!


交叉編譯有點像開發單片機的過程,編寫-編譯-部署-運行。這下便解決了我樹莓派屏幕過小的Bug。因而考慮走交叉編譯的這條路子。python

 

1.工具準備

這裏考慮在Win32環境下編譯針對ARM核的Linux程序開發環境。因此須要兩個東西:Cross-ToolChain和MinGW。linux

  • Raspberry Pi Cross-ToolChain

ToolChain是個什麼東西呢?ToolChain字面意思就是開發工具鏈(集),有了這貨,咱們才能作一些和那邊操做系統相關的事情。這個ToolChain的下載地址是https://downloads.raspberrypi.org/raspbian_latest
首先,須要看一下樹莓派(2)跑的操做系統是個什麼版本的。目前支持的版本有兩種,一個是較新的的Raspbian Jessie,一個是較舊的Raspbian Wheezy。針對較新的系統版本,須要下載的ToolChain是raspberry-gcc-4.9.2-r2;對於較舊的操做系統,須要下載的ToolChain是raspberry-gcc4.6.3。這裏呢我放出來兩個連接,是能夠直接針對系統下載的ToolChain地址:shell

GCC For Rasbian Jessie(raspberry-gcc4.9.2-r2.exe)編程

大小:432MBwindows

 

GCC For Rasbian Wheezy(raspberry-gcc4.6.3.exe)bash

大小:111MB編輯器


當咱們下載完成後,執行安裝:
工具

 

  • MinGW For Win32

MinGW若是有開發過開源軟件的網友應該是很熟悉的,這就是Win32環境下的編譯器。在這裏用做去編譯一些Win32下的Qt工具(譬如qmake之類的東西)。post

MinGW32 GCC

大小:106MB


下載完成後,和ToolChain相同安裝。

 

  • Qt 5.5.0 Source Code

Qt官方並無提供已經編譯好的Qt Embeded For Raspbian的安裝包,咱們須要本身去編譯這些內容,這裏下載Qt的源碼包。

  • Python For Win32

Python呢,是用來編譯聯機調試器用的。

2.配置Raspbian

這裏就不對樹莓派操做系統怎麼裝作解釋了,網上都大同小異,自行百度便可。
Qt運行依賴於一些庫:

1
sudo apt-get install libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync1 libxcb-sync-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev

若是上面的操做執行失敗,能夠執行一下:

1
apt-get-update

在上面安裝的庫裏面有兩個叫libxcb-sync1 libxcb-sync-dev的包,並不能直接經過apt-get安裝,可是我經過度娘搜了好久也沒見到有可用的包,因此我直接放棄安裝,目前也沒見有什麼不正常的地方。

3.同步Linux for ARM

既然最後編譯出來的東西是要在樹莓派上運行的,因此會依賴於一些樹莓派上的庫,因此在編譯以及後續開發的過程當中都會用的到。
在C:\Qt\QtEmbeded5.5.0\Raspberry\TOOLS中打開 UpdateSysroot.bat

根據本身的同步經歷,建議先把樹莓派上一些可有可無,可能到樹莓派報廢都用不到的捆綁軟件在同步前卸載一下,這樣在同步的時候會讓進城耗時短一些。推薦卸載的內容有Wolfram-engine(一款數學建模軟件,這貨能跑我就以爲很神奇)、Sonic-pi(聲音編程,小孩子用來拼個小節奏的軟件)、Minecraft-Pi(個人世界樹莓派嚴重閹割版,能玩,不過不用HDMI輸出很吃力)、python-game(一些Python遊戲,很差玩),而後同步上圖中的一些目錄。上圖中的那個複選框的意思是在傳輸過程當中是否打包,我同步的時候第一次是用的打包(不勾選),可是傳了一會以後就出現了卡死的狀態,我一斷電,系統壞了,還得從新作。我推薦給他勾上,這樣雖然傳的稍稍慢了那麼點,可是很穩定。

4.編譯QMake

以前我曾經裝過一遍Qt,有一個QMake,可是試了不少遍也沒能用那個,最後仍是選擇從新編譯一次Qmake。
首先要將Qt源碼包解壓到一個合適的地方(我是直接放在了C:\Qt\QtEmbeded5.5.0目錄裏),而後打開C:\Qt\QtEmbeded5.5.0\MinGW32\msys\1.0\msys.bat,這個時候應該會出來一個特別像是cmd的東西,可是裏面的語法用的是linux的語法,用來執行一些linux格式的shell文件。

而後確認代碼所有解壓縮到當前目錄下,確認gcc和arm-linux-gnueabihf-gcc工具的路徑:

若是沒有找到gcc和arm-linux-gnueabihf-gcc,你能夠設置你的Windows系統PATH環境變量,加入 c:\Qt\QtEmbeded5.5.0\Raspberry\bin和c:\Qt\QtEmbeded5.5.0\MinGW32\bin

這個時候重點來了。在Qt的源碼包中,針對樹莓派的Linux類型arm-linux-gnueabihf的配置文件並不存在,可是能夠從一個現有的文件修改獲得:打開 qt-everywhere-opensource-src-5.5.0\qtbase\mkspecs\linux-arm-gnueabi-g++下的qmake.conf文件,將全部的arm-linux-gnueabi-替換成arm-linux-gnueabihf。
替換qmake.conf文件內容
如今就能夠開始準備編譯Qt了。Qt的配置文件有個Bug,就是不能直接的交叉編譯咱們的樹莓派上用的Qt,而必須分爲兩步,先編譯針對Win32環境的QMake,而後再編譯針對RaspberryPi的Qt。
打開 qt-everywhere-opensource-src-5.5.0\qtbase\mkspecs\win32-g++ 下的qmake.conf文件,在 CXXFLAGS 後面添加 -U__STRICT_ANSI__ 標記。
添加-U__STRICT_ANSI__標記
而後再以前打開的msys中執行:

1
2
3
4
cd /c/Qt/QtEmbeded5 .5.0/
mkdir Build
cd Build
.. /qt-everywhere-opensource-src-5 .5.0 /configure -platform win32-g++ -xplatform linux-arm-gnueabi-g++ -release -opengl es2 -device linux-rasp-pi-g++ -sysroot C: /Qt/QtEmbeded5 .5.0 /Raspberry/arm-linux-gnueabihf/sysroot -prefix /usr/local/qt5

而後獲得這樣的提示:
編譯QMake
在選擇了Opensource和yes贊成全部協議條款後,開始編譯QMake,編譯完成後提示:
完成QMake編譯

5.交叉編譯樹莓派Qt

在開始爲樹莓派進行交叉編譯前,須要修改一下configure文件。
在qt-everywhere-opensource-src-5.5.0\qtbase\configure文件的3900行有個if true then;,這句致使每次編譯的時候都會默認去編譯一下qmake,可是編譯Qmake後由不能繼續編譯,因此咱們分爲了兩步來作,咱們已經有了已經編譯好的qmake,因此這裏須要改爲:

3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
setBootstrapVariable()
{
     getQMakeConf "$1" | echo ${2-$1} = ` if [ -n "$3" ]; then sed "$3" ; else cat ; fi ` >> "$mkfile"
}
 
# build qmake
if [ '!' -f "$outpath/bin/qmake.exe" ]; then
     echo "Creating qmake..."
 
     mkdir -p "$outpath/qmake" || exit
     # fix makefiles

以下圖所示:
修改Configure文件
Ok,以後就是爲Qt編譯建立MakeFile配置文件。在剛剛的msys窗口中執行:

1
.. /qt-everywhere-opensource-src-5 .5.0 /configure -platform win32-g++ -xplatform linux-arm-gnueabi-g++ -release -opengl es2 -device linux-rasp-pi-g++ -sysroot C: /Qt/QtEmbeded5 .5.0 /Raspberry/arm-linux-gnueabihf/sysroot -prefix /usr/local/qt5 -device-option CROSS_COMPILE=C: /Qt/QtEmbeded5 .5.0 /Raspberry/bin/arm-linux-gnueabihf- -qt-xcb

執行後和剛剛相同,選擇Opensource並贊成全部協議條款:
執行Configure
在選中Opensource並贊成全部條款後,Configure開始檢查並建立MakeFile文件。若是當前編譯環境缺乏一些必要的庫和文件,這時也會提示出來。若是出現了找不到類庫和文件,能夠去檢查下C:\Qt\QtEmbeded5.5.0\Raspberry\arm-linux-gnueabihf\sysroot\etc\ld.so.conf中是否所有包含了如下記錄:

1
2
3
4
5
/opt/vc/lib
/lib/arm-linux-gnueabihf
/usr/lib/arm-linux-gnueabihf
/usr/lib/arm-linux-gnueabihf/libfakeroot
/usr/local/lib

當建立完成後,會看到Configure爲咱們列出了全部的能夠編譯的模塊:
Configure結果
到這裏,最痛苦的階段就要開始了。咱們要開始真真正正的qt編譯階段。在確認了全部須要的模塊都處於可編譯狀態,執行make&&make install。
根據國外的一篇文章,大概會須要幾個小時,我大概花了7個小時左右完成了編譯和安裝。
編譯開始
在開始編譯以後就不要再動電腦了,讓他靜靜的去跑。根據我第一次編譯的結果,若是想看一下編譯的進度,能夠去看下咱們的構建目錄Build中的文件數目。我第一次的編譯結果中共計12817個文件,經過對Build文件夾中文件數量的統計,大體能判斷出來編譯進度。
編譯過程當中的Build目錄屬性
在經歷了N個小時的編譯,終於,msys回到了命令行,也就意味着編譯完成。
編譯完成
到這裏,咱們的編譯工做完成。下面開始配置開發環境。

6.同步Qt5到樹莓派並測試

在以前安裝的RaspberryPi ToolChain的Tools目錄中有個SmarTTY,打開後鏈接上樹莓派的SSH。
SmarTTY鏈接樹莓派
在這裏不建議使用SFTP上傳,由於SFTP不能完整的將文件屬性上傳到樹莓派(根據一位網友),因此使用SmarTTY的上傳功能。在上傳前先在樹莓派的/usr/local/中創建一個名爲qt5的目錄,並將其全部者改成你用來登陸SSH的用戶(默認是pi,我沒有改,因此這裏的全部權給pi)

1
2
3
cd /usr/local
sudo mkdir qt5
sudo chown pi qt5

完成上述操做後,點擊SCP菜單中的Upload a Directory
點擊SCP菜單
打開上傳窗口。配置本地目錄爲C:\Qt\QtEmbeded5.5.0\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5,遠程目錄爲/usr/local/qt5,這裏須要注意一件事情,就是底下這個複選框。若是在以前的同步系統目錄過程當中使用On-the-fly Tar模式同步出現卡死的現象,這裏也必需要將傳輸模式改成單文件模式,不然還會卡死。。。
上傳Qt庫
當上傳完成後咱們就能夠在SSH命令行中執行一個Demo來判斷Qt是否正確的配置了。打開/usr/local/qt5/examples/widgets/richtext/textedit運行./textedit實例,若是正常配置了,那麼在HDMI所鏈接的顯示器上將會正常顯示出一個文本編輯器。若是手頭沒有HDMI顯示設備,可是樹莓派上曾經安裝有一塊SPI的tftLCD屏幕並已經正確的配置並能夠顯示控制檯,那麼也能夠在命令前面添加一段對QT_QPA_PLATFORM環境變量配置的代碼:

1
QT_QPA_PLATFORM=linuxfb:fb=/dev/fb* ./textedit

其中fb*是但願輸出顯示的tft屏幕所對應的framebuffer文件。若是可以正常顯示,說明樹莓派上的Qt5配置已經成功完成。

7.Qt Creator配置開發環境

當Qt成功的運行在了樹莓派上,那麼就能夠開始準備本身開發Qt軟件在樹莓派上運行了。
Qt程序的生成規則是:Qt Creator 開發程序生成.pro和.ui文件->QMake將.pro和.ui文件生成CPP文件->QMake將全部須要編譯的cpp文件和header文件統一彙總製成Makefile文件->使用Makefile開始編譯構建。
因此必需要將QMake,編譯器,鏈接器的信息告知Qt Creator,才能讓Qt Creator在構建操做時可以正確的找到必要的工具。同時,樹莓派的一些信息也須要告知Qt Creator。

  • 準備Qt Creator

Qt Creator可使用Qt 5.5.0 For Win32 那個包裏的QtCreator,也可使用下面的鏈接下載Qt Creator

Qt Creator 3.6.0 For Windows

大小:80.4 MB

 

  • 添加設備(樹莓派)到部署列表

使用Qt Creator直接在樹莓派上部署運行Qt 程序必須將樹莓派添加到部署列表。這裏打開Qt Creator 工具菜單中的選項,選擇左側的設備:
設備列表圖
選擇添加後彈出選擇設備類型的窗口,樹莓派屬於通用Linux設備,選中通用Linux設備,點擊開始嚮導
建立設備
隨後彈出建立通用Linux設備的嚮導,這裏輸入樹莓派的SSH地址、用戶名、密碼:
建立設備嚮導
當填寫完成密碼等信息後,點擊下一步後會要求測試鏈接,隨後彈出鏈接成功的提示:
測試鏈接圖
這時,便成功向Qt Creator添加了一個設備。

  • 添加QMake到Qt Creator

以後全部的Qt 程序編譯都須要用到咱們剛剛編譯的QMake,因此須要將其添加到QtCreator中。打開Qt Creator選項中的構建和運行,右側點擊Qt Versions:
Qt Versions
上圖中已經有的一個是Qt For Win32 的QMake,咱們須要天機QMake For Qt Embeded,點擊右側的添加,選擇C:\Qt\QtEmbeded5.5.0\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5\bin\qmake.exe 。選中後再Qt Version選項卡中將會多出來一項:
Qt Versions

  • 添加編譯器

當前系統中的編譯器編譯結果是在x86機器上運行的程序,並不能在樹莓派ARM芯片上運行,因此須要手動添加一個編譯器。這裏的編譯器仍是使用以前下載的Raspberry ToolChain中的編譯器。打開Qt Creator的編譯與構建選項中編譯器選項卡:
編譯器選項卡
點擊右側添加一個MinGW編譯器,填入下面的信息,點擊應用(Apply):
編譯器設定完成

  • 建立編譯套件(Kits)

當咱們把全部相關的信息都錄入後,須要建立一個編譯套件,來作到QMake,編譯器,鏈接器可以匹配的使用。進入Qt Creator的選項中的構建套件選項卡:
構建套件
點擊右側新建,按照下圖中的信息填寫:
填寫構建套件
上圖中填寫的一些信息:

  • 設備類型:通用Linux設備
  • 設備:剛剛建立的那個設備
  • Sysroot:C:\Qt\QtEmbeded5.5.0\Raspberry\arm-linux-gnueabihf\sysroot
  • 編譯器:剛剛建立的編譯器
  • 調試器:None(由於沒有建立)
  • Qt版本:剛剛建立的Qt5
  • Qt mkspec: C:\Qt\QtEmbeded5.5.0\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5\mkspecs\devices\linux-rasp-pi-g++

其中的調試器我沒有編譯,因此也沒有添加,並且單步調試感受沒有什麼用處,就沒有弄,須要的網友能夠去參考資料中尋找方法。
至此,咱們的Qt Embeded For Raspberry Pi開發環境就已經完成了。

8.常見問題(FAQ)

  1. 中文字體
    樹莓派中的Qt 默認是沒有中文字體的,因此全部在Qt Creator中設置的中文到了樹莓派上都是空白。解決方案很簡單,就是把你須要顯示的字體從電腦的C:\Windows\Fonts文件夾中拷出來,上傳到樹莓派的/usr/local/qt5/lib/fonts目錄中,而後重啓Qt 程序便可。經常使用的字體有SimSum、微軟雅黑、宋體這些,所有考進去就好了
  2. 編寫好Qt程序點擊運行後提示Command Not Found
    這是由於對於Qt 來講並不知道應該把程序部署到樹莓派上的哪一個目錄中來運行,因此會提示找不到命令來執行。解決方案就是在工程的.pro文件中添加如下內容:

     

    1
    2
    target.path=部署目錄,譬如/home/pi/inject
    INSTALLS+=target
  3. 編寫好的Qt程序在測試的時候不能顯示在FrameBuffer上
    這是由於Qt Creator在部署完成後執行程序時並不會添加上QT_QPA_PLATFORM變量,因此咱們須要將這個變量添加至系統變量,在/etc/profile中添加此變量:

     

    1
    export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb*

9.參考文獻

    1. Cross-compiling Qt Embedded 5.5 for Raspberry Pi 2
    2. Qt for Embedded Linux
    3. 適用於樹莓派Raspberry Pi的嵌入式QT平臺(一) — 交叉編譯安裝Qt Embedded 5.5
    4. 適用於樹莓派Raspberry Pi的嵌入式QT平臺(二) — 在Windows下用Qt Creator開發編譯Raspberry Qt 5應用程序
    5. 適用於樹莓派Raspberry Pi的嵌入式QT平臺(三) — 交叉編譯 Raspberry Pi 版GDB with Python

 

http://www.jerryzone.cn/qt-embeded-raspberrypi/

相關文章
相關標籤/搜索