樹莓派開發筆記(二):qt開發環境搭建:樹莓派qt編譯和宿主機qt交叉編譯

若該文爲原創文章,未經容許不得轉載
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客導航:http://www.noobyard.com/article/p-gebpnuxb-mo.html
本文章博客地址:http://www.noobyard.com/article/p-tuyfzbiy-mo.html
各位讀者,知識無窮而人力有窮,要麼改需求,要麼找專業人士,要麼本身研究linux

紅胖子(紅模仿)的博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬結合等等)持續更新中...(點擊傳送門)c++

樹莓派開發專欄(點擊傳送門)

上一篇:《樹莓派開發筆記(一):入手樹莓派3b,成功運行樹莓派系統git

下一篇:《樹莓派開發筆記(三):更便捷的開發,windows下和ubuntu下遠程桌面至樹莓派github

 

前話

    前面已經成功運行樹莓派,下面使用Qt開發樹莓派。ubuntu

 

樹莓派本地qt編譯環境(不推薦)

步驟一:安裝qt5

    安裝樹莓派的桌面版本,能夠直接配置qt環境,此種方法老是卡頓的,因此筆者不太推薦。(2019年9月,筆者再次嘗試使用樹莓派zero wh本地開發,一動卡3-5s,因此此方法只用於跑應用,不建議用於開發)windows

sudo apt-get update
sudo apt-get install qt5-default
sudo apt-get install qtcreator

(若是須要支持qml,須要下載qml的開發環境,使用如下命令)ssh

sudo apt-get install qtdeclarative5-dev

       直接進入qtcreator工具

步驟二:配置qmake等構件套件

       須要本身手動配置構建套件,配置qmake,gcc,g++,gdb。oop

配置c和c++編譯器測試

       配置套件      

步驟三:建立一個GUI程序測試

       運行以下圖:

步驟四:建立一個QtQuick程序測試

       運行失敗,以下圖:

       由於缺乏相應的庫,輸入以下命令:

sudo apt-get install qtdeclarative5-dev

       安裝完成後,運行以下圖:

 

交叉編譯傳送文件FileZilla(使用sftp)

步驟一:ubuntu宿主上安裝FileZilla

       ubuntu上安裝sftp工具,ubuntu軟件中心搜索filezilla並進行安裝。

步驟二:配置鏈接樹莓派ssh環境

       樹莓派和ubuntu在同一個局域網,打開filezilla軟件,登陸樹莓派傳送

       登陸成功,能夠傳送文件了。

 

樹莓派Qt交叉編譯環境(強烈推薦)

安裝ubuntu,是直接裝系統仍是使用虛擬機,你們看着辦,筆記上虛擬機,筆者使用的系統是ubuntu14.04 amd64。

注意:筆者有償提供已交纏編譯樹莓派qt的虛擬機包,經測試其程序能夠在本篇系統也能夠在最新的2019年的bluster系統上正常編譯運行,可先驗證測試是否能夠運行。

下載測試程序運行地址:

步驟一:下載樹莓派的交叉編譯工具鏈

       使用git下載:

cd
mkdir ~/work
cd ~/work
sudo apt-get install git 
git clone git://github.com/raspberrypi/tools.git

       git時間有點漫長,請繼續等待,總共約1.3GB(壓縮包是800MB)左右,建議去其餘地方下。

       下載下來後咱們直接放到~/work/tools

       該工具鏈中包含了製做鏡像的工具,編譯器,測試代碼等等,其實咱們只用到了編譯器,因ubuntu是64位的,因此使用x64的,如果32位,則直接使用不帶x64尾綴下的便可。

步驟二:測試交叉編譯工具鏈

       檢測下編譯器是否運行成功:

       將路徑引入系統環境變量:

export PATH=$PATH:~/work/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

       測試

mkdir ~/work/project/testHello -p
cd ~/work/project/testHello
sudo apt-get install gedit
gedit main.c

       輸入程序,並退出arm  保存

#include <stdio.h>
int main(int argc, char **argv)
{
    printf("Hello, you do it succeed!!!\n");
    return 0;
}

       而後編譯

arm-linux-gnueabihf-g++ main.c

       輸出a.out,準備放到目標機驗證,使用FileZilla(參照FileZilla遠程傳送)傳送a.out文件到是樹莓派桌面(樹莓派須要啓動ssh服務,可參照《樹莓派開發筆記(一):入手樹莓派3b,成功運行樹莓派系統》中的「配置ssh服務」。

       下面打開另一個終端,使用ssh遠程登陸,做爲交叉編譯的登陸,咱們建立測試文件夾,操做樹莓派:

mkdir ~/qtProject/testCrossCompile -p
cd ~/qtProject/testCrossCompile
cp ~/Desktop/a.out .
./a.out

       輸出語句,交叉編譯程序成功。

步驟三:掛載樹莓派文件系統

此處掛載樹莓派文件系統,主要是對qt源碼進行交叉編譯時,須要的一些頭文件和庫的依賴。在後面使用qt的qmake交叉編譯qt應用程序時,也會依賴一些庫,如操做樹莓派gpio則須要樹莓派自帶的本地庫。

將《樹莓派開發筆記(一):入手樹莓派3b,成功運行樹莓派系統》下載的樹莓派系統2018-03-13-raspbian-stretch.img拷貝到ubuntu的桌面上,操做ubuntu。

mkdir ~/work/img
cd ~/ work /img
mv ~/Desktop/2018-03-13-raspbian-stretch.img .
sudo mkdir /mnt/pi-rootfs

       掛載主要分區,使用fdisk –l查看掛載分區

       此處,若offset不對,mount會提示須要指定文件系統格式,因此要fdisk查看。

sudo mount -o loop,offset=$((98304*512)) 2018-03-13-raspbian-stretch.img /mnt/pi-rootfs/

步驟四:安裝ubuntu的qt(須要qmake和qtcreator)

    qmake默認會使用系統的qmake,由於版本等問題,可能會直接影響後面qt編譯源碼出現奇葩錯誤,因此下載直接可安裝的包,而且同時安裝了qctreaor用於開發樹莓派qt程序的IDE。

sudo apt-get update
sudo apt-get install g++
sudo apt-get install libgl1-mesa-dev

       直接安裝qt5.9.3

             

安裝完成後,先建立一個gui程序,配置編譯構建套並跑起來。

             

此時以下命令:

ls -l /usr/bin/qmake

       可發現鏈接的文件不存在。

       創建軟鏈接

sudo ln -sf /home/yang/Qt5.7.1/5.7/gcc_64/bin/qmake /usr/bin/qmake

       檢查確認一次

步驟五:下載qt源碼矯正庫文件

    桌面版本安裝了qt5,那麼咱們就不必本身配置了,下次也能夠直接裝qt5,最關鍵的點是,下載交叉編譯的qt源碼須要和樹莓派對應,咱們查看樹莓派qt的版本,以下圖,樹莓派的qt版本是5.7.1。

    qt源碼在下地址:http://download.qt.io/archive/qt

    下載5.7.1的源碼,若是讀者版本不同本身下載對應版本的源碼。

       將源碼拷貝到~/work下,沒有該目錄就建立。

cd ~/work
tar xvf qt-everywhere-opensource-src-5.7.1.tar.gz
mv qt-everywhere-opensource-src-5.7.1 qt5.7.1

       此處配置下系統,若是是32位則無需配置,是64位則須要添加32位支持

sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0

       獲取交叉編譯

git clone https://github.com/darius-kim/cross-compile-tools.git

       矯正庫文件

cd cross-compile-tools
sudo ./fixQualifiedLibraryPaths /mnt/rasp-pi-rootfs/ ~/work/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc

步驟六:配置qt編譯參數

       下面對qt進行配置

cd ~/work/qt5.7.1/qtbase
./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=arm-linux-gnueabihf- -sysroot /mnt/pi-rootfs -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -prefix /usr/local/qt5pi -hostprefix /usr/local/qt5pi -v

       注意:-sysroot是編譯時參照的根目錄,-prefix是帶上sysroot相對參照根目錄的目錄,而-hostprefix是對於主機系統的目錄。因此以上配置路徑詳解爲下:

       編譯時查找/usr/inclue/test.h頭文件:會查找/mnt/pi-rootfs/usr/include/test.h;

       安裝時安裝到文件路徑(prefix):/mnt/pi-rootfs/usr/local/qt5pi,主要是目標機的庫文件,插件等等,會自動分開裝爲prefix和hostprefixe;

       安裝時安裝到文件路徑(hostprefix):/usr/local/qt5pi,主要是主機編譯用。

       配置過程出現錯誤以下:

       切換一個終端查找樹莓派下的libglesv2,是有的,以下圖:

       創建一個軟鏈接

cd /mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf
sudo ln -sf libGLESv2.so.2 libGLESv2.so

       切回配置qt的終端,繼續配置,配置完成

步驟七:編譯並安裝qtbase

       使用make –j4,make過程也是先前出現g++,後續爲arm-linux-gnueabihf-g++。

       出現錯誤,找不到libz.so,librt.so,libm.so,以下圖:

       通過查看實際上是有這三個庫的,只是由於他們是符號連接到/usr/lib因此出錯了,以下圖:

       執行指令:

cd /mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf
sudo ln -sf /mnt/rasp-pi-rootfs/lib/arm-linux-gnueabihf/libm.so.6 libm.so
sudo ln -sf /mnt/rasp-pi-rootfs/lib/arm-linux-gnueabihf/librt.so.1 librt.so
sudo ln -sf /mnt/rasp-pi-rootfs/lib/arm-linux-gnueabihf/libz.so.1.2.8 libz.so

       繼續make -j4,編譯完成

       安裝sudo make install,安裝完成,下面編譯其餘模塊,最好按照順序編,以前筆者一直總體編譯,老是出現各類問題,入坑約1天多的時間。

步驟八:檢查qmake

       檢查qmake是否成功安裝(應該是有參數-hostprefix決定,不帶sysroot前綴,而prefix帶sysroot)。

ls /usr/local/qt5pi/bin/qmake

       找到qmake,能夠交叉編譯其餘模塊。

       先把qmake文件夾複製到/usr/local/qt5pi

sudo cp -arf ~/work/qt5.7.1/qtbase/bin /mnt/rasp-p-rootfs/usr/local/qt5pi/
/mnt/rasp-pi-rootfs/usr/local/qt5pi/bin/qmake -v

       在交叉編譯其餘模塊前,驗證如下qt交叉編譯是否能夠成功編譯目標機上的程序。

步驟九:編譯目標機程序並運行驗證(qml缺乏模塊,須要編譯其餘模塊)

       下面打開qtcreator建立一個工程,來檢測是否能夠交叉編譯。

       配置交纏編譯構建套件

       主要是qmake最爲關鍵:

       建立一個testWidget項目交叉編譯。

       編譯後沒法運行,打開終端運行文件並查看文件

       表示咱們成功了一大半,而後放到樹莓派上桌面上運行,以下圖:

       運行成功,以下圖:

步驟十:編譯其餘模塊

       編譯其餘交叉編譯的模塊,這裏筆者將交纏編譯全部模塊,由於做爲開發機全一點比較好,部署時須要哪一個就哪一個,避免其餘項目可能致使的須要從新編模塊,對於大部分人,交叉編譯都是有點麻煩的。

cd ~/work/qt5.7.1/
/usr/local/qt5pi/bin/qmake
make -j4
sudo make install

       從新使用目標平臺的qmake掃一遍全部模塊(以前qtbase已配置好),而後make,編譯。

       在編譯模塊qtdeclarattive過程當中,出現錯誤,以下圖:

       修改源碼

cd ~/work/qt5/qt-everywhere-opensource-src-5.7.1/qtdeclarative/src/qml/qml
gedit qqmlmemoryprofiler.cpp

       搜索static bool openLibrary()

       在#ifndef QT_NO_LIBRARY上添加一句#define QT_NO_LIBARRY

       編譯完成

       建議多make兩次,僅make。

       而後make install

       至此5.7.1全部源碼交叉編譯完美完成。

       查看prefix目標機,sysroot/prefix,bin是用於宿主機編譯目標機的,實際不能直接編,缺乏mkspec配置編譯器,咱們忽略bin目錄(以hostprefix爲主)。

,

       查看hostprefix主機,主要是編譯編譯工具。

 

上一篇:《樹莓派開發筆記(一):入手樹莓派3b,成功運行樹莓派系統

下一篇:《樹莓派開發筆記(三):更便捷的開發,windows下和ubuntu下遠程桌面至樹莓派

 

原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客導航:http://www.noobyard.com/article/p-gebpnuxb-mo.html
本文章博客地址:http://www.noobyard.com/article/p-tuyfzbiy-mo.html