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



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

鏈接: https://pan.baidu.com/s/1S68mCNqND2cJoS2DKACDlg 提取碼: z5h1

第一步 准備鏡像文件

選擇樹莓派的版本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

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

下文中會用到git工具,我們先安裝

sudo apt-get install git

第二步,准備交叉編譯鏈

在/usr/local路徑中創建rpi文件夾,進入文件夾后下載樹莓派交叉編譯鏈

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

沒有FQ加速的話,這個過程會比較慢,可以關屏睡覺了。
另外可以直接使用我分享tools.gz ,如果沒有/usr/local/rpi文件夾需要先創建,如下操作。

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

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

ls /usr/local/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/

圖3

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

圖4

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

第三步,准備cross-compile-tools工具

這個工具能否編譯成功非常關鍵,我的分享地址<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

第四步,下載QT源碼庫並進行編譯

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

圖6

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

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

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

./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

中途會彈出如下錯誤

圖7

重新對編譯鏈進行連接

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 

編譯過程彈出錯誤

圖8

這是因為linux-rasp-pi3-g++ 的配置文件qtbase/mkspecs/devices/linux-rasp-pi3-g++/qmake.conf的CPU類型是arm8-a, 我們在樹莓派中用如下指令查詢一下

uname -a

圖9


查看qtbase/mkspecs/devices/linux-rasp-pi2-g++/qmake.conf的配置文件,CPU選擇的是arm7-a和我們系統基本一致。
更換設備類型重新編譯。

./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

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

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

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

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

圖11

這時發現問題的原因了,使用庫時無法找到庫文件,按如下方式進行連接。

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

到此時可以測試一下opengl_es2是否可以編譯。
如下指令進行測試

cd config.tests/opengl_es2
make clean 
make

圖12

當如上顯示時,表示成功。
下一步開始編譯

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

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

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

圖13

圖14

但是這樣執行下去,編譯出來的qt程序任然無法運行,會提示“Could not initialize egl display”

那么復盤重來

步,補充編譯鏈

參考官方手冊https://wiki.qt.io/RaspberryPi2EGLFS
發現我們動態鏈接庫存在問題,那么重新進行配置(針對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

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

make
sudo make install 

最后,鏡像燒寫

編譯和安裝完成后,執行一次<b>硬盤同步</b>(注意這一步很關鍵,保證數據從緩存同步到SD卡中),然后卸除掛載。接入SD卡到虛擬機,向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

注意:如果出現燒寫完成后系統無法啟動時,或卡在掛載點跳轉處時多半是鏡像燒寫不完整問題。可以將鏡像復制到windows下通過Win32DiskImager.exe工具燒寫。
到這里樹莓派QT5.9.9成功交叉編譯的鏡像已經創建完成,最難的一步已經完成。后續文章會描述QT的環境配置。

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


免責聲明!

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



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