前兩天入手了一塊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
這裏考慮在Win32環境下編譯針對ARM核的Linux程序開發環境。因此須要兩個東西:Cross-ToolChain和MinGW。linux
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
當咱們下載完成後,執行安裝:工具
MinGW若是有開發過開源軟件的網友應該是很熟悉的,這就是Win32環境下的編譯器。在這裏用做去編譯一些Win32下的Qt工具(譬如qmake之類的東西)。post
下載完成後,和ToolChain相同安裝。
Qt官方並無提供已經編譯好的Qt Embeded For Raspbian的安裝包,咱們須要本身去編譯這些內容,這裏下載Qt的源碼包。
Python呢,是用來編譯聯機調試器用的。
這裏就不對樹莓派操做系統怎麼裝作解釋了,網上都大同小異,自行百度便可。
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安裝,可是我經過度娘搜了好久也沒見到有可用的包,因此我直接放棄安裝,目前也沒見有什麼不正常的地方。
既然最後編譯出來的東西是要在樹莓派上運行的,因此會依賴於一些樹莓派上的庫,因此在編譯以及後續開發的過程當中都會用的到。
在C:\Qt\QtEmbeded5.5.0\Raspberry\TOOLS中打開 UpdateSysroot.bat
根據本身的同步經歷,建議先把樹莓派上一些可有可無,可能到樹莓派報廢都用不到的捆綁軟件在同步前卸載一下,這樣在同步的時候會讓進城耗時短一些。推薦卸載的內容有Wolfram-engine(一款數學建模軟件,這貨能跑我就以爲很神奇)、Sonic-pi(聲音編程,小孩子用來拼個小節奏的軟件)、Minecraft-Pi(個人世界樹莓派嚴重閹割版,能玩,不過不用HDMI輸出很吃力)、python-game(一些Python遊戲,很差玩),而後同步上圖中的一些目錄。上圖中的那個複選框的意思是在傳輸過程當中是否打包,我同步的時候第一次是用的打包(不勾選),可是傳了一會以後就出現了卡死的狀態,我一斷電,系統壞了,還得從新作。我推薦給他勾上,這樣雖然傳的稍稍慢了那麼點,可是很穩定。
以前我曾經裝過一遍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。
如今就能夠開始準備編譯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__ 標記。
而後再以前打開的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
|
而後獲得這樣的提示:
在選擇了Opensource和yes贊成全部協議條款後,開始編譯QMake,編譯完成後提示:
在開始爲樹莓派進行交叉編譯前,須要修改一下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
|
以下圖所示:
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並贊成全部協議條款:
在選中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爲咱們列出了全部的能夠編譯的模塊:
到這裏,最痛苦的階段就要開始了。咱們要開始真真正正的qt編譯階段。在確認了全部須要的模塊都處於可編譯狀態,執行make&&make install。
根據國外的一篇文章,大概會須要幾個小時,我大概花了7個小時左右完成了編譯和安裝。
在開始編譯以後就不要再動電腦了,讓他靜靜的去跑。根據我第一次編譯的結果,若是想看一下編譯的進度,能夠去看下咱們的構建目錄Build中的文件數目。我第一次的編譯結果中共計12817個文件,經過對Build文件夾中文件數量的統計,大體能判斷出來編譯進度。
在經歷了N個小時的編譯,終於,msys回到了命令行,也就意味着編譯完成。
到這裏,咱們的編譯工做完成。下面開始配置開發環境。
在以前安裝的RaspberryPi ToolChain的Tools目錄中有個SmarTTY,打開後鏈接上樹莓派的SSH。
在這裏不建議使用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
打開上傳窗口。配置本地目錄爲C:\Qt\QtEmbeded5.5.0\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5,遠程目錄爲/usr/local/qt5,這裏須要注意一件事情,就是底下這個複選框。若是在以前的同步系統目錄過程當中使用On-the-fly Tar模式同步出現卡死的現象,這裏也必需要將傳輸模式改成單文件模式,不然還會卡死。。。
當上傳完成後咱們就能夠在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配置已經成功完成。
當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 5.5.0 For Win32 那個包裏的QtCreator,也可使用下面的鏈接下載Qt Creator
使用Qt Creator直接在樹莓派上部署運行Qt 程序必須將樹莓派添加到部署列表。這裏打開Qt Creator 工具菜單中的選項,選擇左側的設備:
選擇添加後彈出選擇設備類型的窗口,樹莓派屬於通用Linux設備,選中通用Linux設備,點擊開始嚮導
隨後彈出建立通用Linux設備的嚮導,這裏輸入樹莓派的SSH地址、用戶名、密碼:
當填寫完成密碼等信息後,點擊下一步後會要求測試鏈接,隨後彈出鏈接成功的提示:
這時,便成功向Qt Creator添加了一個設備。
以後全部的Qt 程序編譯都須要用到咱們剛剛編譯的QMake,因此須要將其添加到QtCreator中。打開Qt Creator選項中的構建和運行,右側點擊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選項卡中將會多出來一項:
當前系統中的編譯器編譯結果是在x86機器上運行的程序,並不能在樹莓派ARM芯片上運行,因此須要手動添加一個編譯器。這裏的編譯器仍是使用以前下載的Raspberry ToolChain中的編譯器。打開Qt Creator的編譯與構建選項中編譯器選項卡:
點擊右側添加一個MinGW編譯器,填入下面的信息,點擊應用(Apply):
當咱們把全部相關的信息都錄入後,須要建立一個編譯套件,來作到QMake,編譯器,鏈接器可以匹配的使用。進入Qt Creator的選項中的構建套件選項卡:
點擊右側新建,按照下圖中的信息填寫:
上圖中填寫的一些信息:
其中的調試器我沒有編譯,因此也沒有添加,並且單步調試感受沒有什麼用處,就沒有弄,須要的網友能夠去參考資料中尋找方法。
至此,咱們的Qt Embeded For Raspberry Pi開發環境就已經完成了。
1
2
|
target.path=部署目錄,譬如/home/pi/inject
INSTALLS+=target
|
1
|
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb*
|
http://www.jerryzone.cn/qt-embeded-raspberrypi/