經(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

掛載偏移值計(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/

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

依次安裝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

第四步,下載QT源碼庫并進(jìn)行編譯
cd ~
git clone git://code.qt.io/qt/qt5.git -b 5.9
cd qt5/
./init-repository

這里同學(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ò)誤

重新對(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ò)誤

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

查看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

這次雖然成功了但是不支持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*

這時(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

當(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


但是這樣執(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