經過無數次失敗總結出如下方法,通過這個方法可以成功進行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