樹莓派+QT5.9.9交叉編譯,100%可以使用的交叉編譯

經(jīng)過無數(shù)次失敗總結(jié)出如下方法,通過這個(gè)方法可以成功進(jìn)行2017~2019年樹莓派官方鏡像的交叉編譯。我最早使用的2017年的鏡像,下文中2017年的鏡像交叉編譯要簡單些,省略下文中opengl es2編譯不成功的配置部分。后來手上有了一個(gè) 樹莓派 3B+板子,2017年的鏡像就無法使用了。加上QT最近幾年對(duì)穩(wěn)定性進(jìn)行了大量的優(yōu)化,使用新版本可以避免很多問題,所以新版本QT升級(jí)很有必要。
首先先說下系統(tǒng)的選擇,一開始我選擇的是Ubuntu 16.04 x64位的系統(tǒng),這個(gè)系統(tǒng)在對(duì)Raspbian進(jìn)行添加鏈接庫有點(diǎn)問題。后來選擇使用Ubuntu 14.04 x86 32位系統(tǒng),最終也可可以編譯出正確的qmake的,但是存在一個(gè)問題,因?yàn)?2位的系統(tǒng)也只能選擇32位的qt-creator,能找到的版本基本上都是QT5.5之前的版本,高版本都是64位的無法安裝。咱們編譯出的qmake都是5.9.9版本,后續(xù)用QT在linux下設(shè)計(jì)會(huì)受限制。最終還是使用Ubuntu 14.04 x64位系統(tǒng)。QT安裝包最終使用的是Qt5.9.6版本,下一篇文章中有詳細(xì)說明。還有個(gè)注意事項(xiàng)需要說明下,QT5.9.6安裝包一定要在交叉編譯完成之后再進(jìn)行安裝,對(duì)本文多次驗(yàn)證基本都成功,但偶爾也有一次的失敗,經(jīng)分析要么是復(fù)制文件造成數(shù)據(jù)缺失、要么是先安裝QT5.9.6造成的。
下文中所用到的下載內(nèi)容,我都進(jìn)行了打包上傳到百度云盤,如果同學(xué)在編譯過程中遇到阻礙,可以下載下來配合本文進(jìn)行對(duì)比分析。
鏈接: https://pan.baidu.com/s/1RMU9ojc1H8Y8VScPqEjMgA 提取碼: zu6z

第一步 準(zhǔn)備鏡像文件

選擇樹莓派的版本http://downloads.raspberrypi.org/raspbian/images/
我們使用的是2019-04-08-raspbian-stretch.img

新建鏡像文件掛載路徑,新建鏡像存放文件夾rpi

sudo mkdir /mnt/rasp-pi-rootfs/
sudo mkdir /mnt/rasp-boot/
mkdir rpi
cd rpi

使用WinSCP工具將文件放入rpi文件夾中,然后查看鏡像文件的索引。

fdisk -l 2019-04-08-raspbian-stretch.img
圖1.png

掛載偏移值計(jì)算 offset=98304*512=50331648

sudo mount -o offset=50331648 -t ext4 2019-04-08-raspbian-stretch.img /mnt/rasp-pi-rootfs/

掛載boot 同理offset=8192*512= 4194304

sudo mount -o offset=4194304 -t vfat 2019-04-08-raspbian-stretch.img /mnt/rasp-boot/

下文中會(huì)用到git工具,我們先安裝

sudo apt-get install git

第二步,準(zhǔn)備交叉編譯鏈

在/usr/local路徑中創(chuàng)建rpi文件夾,進(jìn)入文件夾后下載樹莓派交叉編譯鏈

cd /usr/local
sudo mkdir rpi
cd rpi
sudo git clone git://github.com/raspberrypi/tools.git

沒有翻墻加速的話,這個(gè)過程會(huì)比較慢,可以關(guān)屏睡覺了。
另外可以直接使用我分享tools.gz ,如果沒有/usr/local/rpi文件夾需要先創(chuàng)建,如下操作。

sudo mkdir /usr/local/rpi
sudo tar zxvf tools.gz -C /usr/local/rpi/

完成后進(jìn)行查看,我們選擇的是gcc-linaro-arm-linux-gnueabihf-raspbian工具鏈

ls /usr/local/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/
圖3.png

依賴庫安裝 (32位Ubuntu跳過此步驟)
sudo apt-get install ia32-libs
安裝時(shí)會(huì)彈出如下


圖4.png

依次安裝lib32z1 lib32ncurses5,描述是替代庫。(32位Ubuntu跳過此步驟)

sudo apt-get install lib32ncurses5
sudo apt-get install lib32z1
sudo apt-get install lib32bz2-1.0

cross-compile-tools需要的庫

sudo apt-get install lib32stdc++6 

QT編譯需要安裝的編譯鏈

sudo apt-get install g++

第三步,準(zhǔn)備cross-compile-tools工具

這個(gè)工具能否編譯成功非常關(guān)鍵,我的分享地址<a href=""></a>,使用WinSCP放入在~/rpi文件中

cd cross-compile-tools/
chmod +x *
sudo ./fixQualifiedLibraryPaths /mnt/rasp-pi-rootfs/ /usr/local/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc
圖5.png

第四步,下載QT源碼庫并進(jìn)行編譯

cd ~
git clone git://code.qt.io/qt/qt5.git -b 5.9
cd qt5/
./init-repository
圖6.png

這里同學(xué)們一定會(huì)很奇怪,前面不是已經(jīng)安裝了Qt5.9.9了么,這里為什么還需要下載。前文中我們主要是安裝QCreator和linux x86 qmake這兩個(gè)工具,我們還缺少RaspberryPi的qmake工具,這里是下載Qt5.9源碼并且編譯出Rpi中的qmake。
這個(gè)過程也比較慢,需要耐心等待。如果嫌下載太慢可以使用我的分享,先用WinScp下載到rpi文件中,如下指令進(jìn)行解壓。

cd rpi
tar zxvf qt5.tar.gz -C ~/

<b>從這里到第五步之間的內(nèi)容可以忽略</b>,記錄下來是方便以后遇到類似問題可以知道解決方法。

./configure -opengl es2 -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=/usr/local/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- -sysroot /mnt/rasp-pi-rootfs/ -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -make tools -prefix /usr/local/qt5pi -v -nomake examples -nomake tests

中途會(huì)彈出如下錯(cuò)誤


圖7.png

重新對(duì)編譯鏈進(jìn)行連接

cd /mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf
sudo rm libm.so 
sudo ln -s ../../../lib/arm-linux-gnueabihf/libm.so.6 libm.so 

編譯過程彈出錯(cuò)誤


圖8.png

這是因?yàn)閘inux-rasp-pi3-g++ 的配置文件qtbase/mkspecs/devices/linux-rasp-pi3-g++/qmake.conf的CPU類型是arm8-a, 我們?cè)跇漭芍杏萌缦轮噶畈樵円幌?/p>

uname -a
圖9.png

查看qtbase/mkspecs/devices/linux-rasp-pi2-g++/qmake.conf的配置文件,CPU選擇的是arm7-a和我們系統(tǒng)基本一致。
更換設(shè)備類型重新編譯。
./configure -opengl es2 -device linux-rasp-pi2-g++ -device-option CROSS_COMPILE=/usr/local/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- -sysroot /mnt/rasp-pi-rootfs/ -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -make tools -prefix /usr/local/qt5pi -v -nomake examples -nomake tests


圖10.png

這次雖然成功了但是不支持opengl es2 我們需要修改配置文件。

vi qtbase/mkspecs/devices/linux-rasp-pi2-g++/qmake.conf

之前我在2017的樹莓派官方鏡像,交叉編譯過程中是支持openg1 es2的。這次將鏡像文件中的/opt/vc/lib/進(jìn)行比較

cd /mnt/rasp-pi-rootfs
ls opt/vc/lib/ -lh
sudo find -name libEGL*
sudo find -name libGLESv2*
圖11.png

這時(shí)發(fā)現(xiàn)問題的原因了,使用庫時(shí)無法找到庫文件,按如下方式進(jìn)行連接。

cd opt/vc/lib/
sudo ln -s ../../../usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 libEGL.so
sudo ln -s ../../../usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 libGLESv2.so

到此時(shí)可以測試一下opengl_es2是否可以編譯。
如下指令進(jìn)行測試

cd config.tests/opengl_es2
make clean 
make
圖12.png

當(dāng)如上顯示時(shí),表示成功。
下一步開始編譯

cd ~/qt5/
./configure -opengl es2 -device linux-rasp-pi2-g++ -device-option CROSS_COMPILE=/usr/local/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- -sysroot /mnt/rasp-pi-rootfs/ -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -make tools -prefix /usr/local/qt5pi -v -nomake examples -nomake tests -no-use-gold-linker

小技巧:當(dāng)提示“make: Nothing to be done for `first'.”并很快編譯完成時(shí),說明沒有進(jìn)行重新編譯,我們可以將-device linux-rasp-pi2-g++先改成-device linux-rasp-pi-g++編譯一次,然后再-device linux-rasp-pi2-g++編譯

到此我們終于顯示了久未的圖13圖14


圖13.png
圖14.png

但是這樣執(zhí)行下去,編譯出來的qt程序任然無法運(yùn)行,會(huì)提示“Could not initialize egl display”

那么<b>復(fù)盤重來</b>

第五步,補(bǔ)充編譯鏈

參考官方手冊(cè)https://wiki.qt.io/RaspberryPi2EGLFS
發(fā)現(xiàn)我們動(dòng)態(tài)鏈接庫存在問題,那么重新進(jìn)行配置(針對(duì)2018~2019的樹莓派鏡像)

cd /mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf
sudo mv libEGL.so.1.0.0 libEGL.so.1.0.0_backup
sudo mv libGLESv2.so.2.0.0 libGLESv2.so.2.0.0_backup

sudo ln -s ../../../opt/vc/lib/libEGL.so libEGL.so.1.0.0
sudo ln -s ../../../opt/vc/lib/libGLESv2.so libGLESv2.so.2.0.0

cd /mnt/rasp-pi-rootfs/opt/vc/lib/
sudo ln -s libbrcmEGL.so libEGL.so
sudo ln -s libbrcmGLESv2.so libGLESv2.so

sudo ln -s libEGL.so libEGL.so.1
sudo ln -s libGLESv2.so libGLESv2.so.2

重新編譯配置

cd ~/qt5/
./configure -opengl es2 -device linux-rasp-pi2-g++ -device-option CROSS_COMPILE=/usr/local/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- -sysroot /mnt/rasp-pi-rootfs/ -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -make tools -prefix /usr/local/qt5pi -v -nomake examples -nomake tests -no-use-gold-linker

到這里沒有問題,咱們就成功的一大半了。有過遇到什么問題,請(qǐng)下載我的分享,重新按上述步驟再執(zhí)行一次,應(yīng)該可以解決。下面就是QT的源碼交叉編譯了。

make
sudo make install 

最后,鏡像燒寫

編譯和安裝完成后,執(zhí)行一次<b>硬盤同步</b>(注意這一步很關(guān)鍵,保證數(shù)據(jù)從緩存同步到SD卡中),然后卸除掛載。接入SD卡到虛擬機(jī),向SD卡燒寫鏡像。

sudo sync
sudo sudo umount /mnt/rasp-pi-rootfs
cd ~/rpi
sudo dd bs=1M if=2019-04-08-raspbian-stretch.img of=/dev/sdb
sudo sync

注意:如果出現(xiàn)燒寫完成后系統(tǒng)無法啟動(dòng)時(shí),或卡在掛載點(diǎn)跳轉(zhuǎn)處時(shí)多半是鏡像燒寫不完整問題??梢詫㈢R像復(fù)制到windows下通過Win32DiskImager.exe工具燒寫。
到這里樹莓派QT5.9.9成功交叉編譯的鏡像已經(jīng)創(chuàng)建完成,最難的一步已經(jīng)完成。后續(xù)文章會(huì)描述QT的環(huán)境配置。

下來大家發(fā)現(xiàn)有什么問題或需要討論交流,可以在簡書、博客園、或郵箱將問題進(jìn)行留言,我會(huì)及時(shí)回復(fù)和更新。
郵箱: whqcxz@163.com
原創(chuàng):https://www.simbahiker.com/news/0220200610001.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容