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的交叉編譯,至於什么是交叉編譯:

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


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

 

1.工具准備

這里考慮在Win32環境下編譯針對ARM核的Linux程序開發環境。所以需要兩個東西:Cross-ToolChain和MinGW。

  • 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地址:

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

大小:432MB

 

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

大小:111MB


當我們下載完成后,執行安裝:

 

  • MinGW For Win32

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

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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM