20200628-01 raspberrypi 4B Qt5.14.2 基於 ubuntu18.04 交叉編譯

前言

執行流程包含樹莓派上的操作,以及 PC 機上的操作,可以通過後綴[pi] 或 [pc] 來區分,整個教程參考這些文章和視頻如有需求可自行前往

Qt 官方教程文檔
Qt For X11 要求
他人教程文檔
他人完整教程視頻

正式流程

1) 安裝 樹莓派 4B 系統

直接去官網下載,這是我選用的版本
在這裏插入圖片描述

window 下可以用這個作爲燒寫器

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-063TfvDT-1593330857905)(en-resource://database/22277:1)]

2) 樹莓派安裝庫

樹莓派從 4B 版本開始於前面幾個版面使用的顯示插件略微有些許不同,這個會在後續步驟支出

2.1 連接 樹莓派

默認用戶名 pi 密碼 raspberry

  • 方式一:直接通過 MCRIO HDMI 轉出來到顯示器上
  • 方式二:在 SD 卡上新建 一個文件名是 SSH 文件(無尾綴)就能通過其它工具登陸

之後可以通過 VNC 直接顯示

1 sudo passwd root 設置密碼
2 sudo passwd --unlock root 解鎖 root 用戶
3 sudo raspi-config
4 如圖,啓動 VNC 和 SSH,推薦直接用 SSH 登陸即可,方便操作
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-AuS5Loqb-1593330857910)(en-resource://database/22287:1)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3IdAgvYF-1593330857916)(en-resource://database/22285:1)]
5 輸入 IP 然後根據提示登陸即可
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-X5jCrf2Z-1593330857922)(en-resource://database/22289:1)]

2.2 更新系統鏡像源

這裏使用的是國內清華大學的資源,這裏需要說明一個細節

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EiZnR3yc-1593330857925)(en-resource://database/22283:1)]

如圖所示,鏡像版本是 buster 則就要使用尾綴是 buster 的鏡像庫

# 將原先文件內的庫路徑給註釋掉,用下面的內容替換
# 1 軟件源
# 路徑:sudo vi /etc/apt/sources.list
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi

# 2 內核源
# 路徑: sudo nano /etc/apt/sources.list.d/raspi.list
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui 
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui

# 3 更新源
sudo apt-get update 
sudo apt-get upgrade 
2.3 更新固件

指令sudo rpi-update
若出現如下提示,說明跟新失敗

!!! Failed to download update for rpi-update!
!!! Make sure you have ca-certificates installed and that the time is set correctly

具體說明可以參考這篇

這是因爲 rpi-update 會自動更新自己,但國內因爲某些原因通常沒法成功,所以跳過這一步直接執行內核更新

手動執行固件更新進行如下步驟
1 sudo apt-get install ca-certifacates 安裝 CA 證書
2 sudo apt-get install ntpdate 安裝時間更新包
3 sudo ntpdate -u ntp.ubuntu.com 同步時間
4 sudo UPDATE_SELF=0 rpi-update 手動更新固件

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Y6im8at9-1593330857927)(en-resource://database/22291:1)]

更新完成之後檢查
cd /opt/vc/lib
如果有 libEGL.so 和 libGLESv2.so 說明更新成功,直接重啓
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-TQKbBsLg-1593330857930)(en-resource://database/22293:1)]

具體可以查看/opt/vc/lib目錄下的內容,更新前是沒有libEGL.so和libGLESv2.so的,只有libbrcmEGL.so和libbrcmGLESv2.so,brcm的意思是博通,而我們前面說了博通的驅動是以前的樹莓派用的

2.4 安裝必要的庫
# 中文
sudo apt-get install fonts-wqy-zenhei
# 其它庫
sudo apt-get install "^libxcb.*"

sudo apt-get install libboost1.58-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev

PC 端操作

1 同步庫

先建一個文件夾

1 sudo mkdir /opt/qt5pi
2 sudo chown pi:pi qt5pi
3 mkdir sysroot

同步操作
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-DgtZKiVo-1593330857933)(en-resource://database/22295:1)]

rsync -avz [email protected]:/lib sysroot
rsync -avz [email protected]:/usr/include sysroot/usr
rsync -avz [email protected]:/usr/lib sysroot/usr
rsync -avz [email protected]:/opt/vc sysroot/opt
2 修改 opengl 的鏈接
#目的:啓用 硬件 OPENGL 默認是通過軟件模擬的
mv sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0 sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0_backup
mv sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0 sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0_backup
ln -s sysroot/opt/vc/lib/libEGL.so sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0
ln -s sysroot/opt/vc/lib/libGLESv2.so sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0
ln -s sysroot/opt/vc/lib/libEGL.so sysroot/opt/vc/lib/libEGL.so.1
ln -s sysroot/opt/vc/lib/libGLESv2.so sysroot/opt/vc/lib/libGLESv2.so.2
3 配置相對路徑

在 /opt/qt5pi 目錄下執行

./sysroot-relativelinks.py sysroot

獲取 sysroot-relativelinks.py

#現在文檔裏很多都通過這個方式獲取 sysroot-relativelinks.py 文件
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py

#本人沒有成功,所以我是在 github 檢索 sysroot-relativelinks 手動下載
https://github.com/trandinhchuong/sysroot-relativelinks 
這個路徑在我寫下這個配置文檔時依舊可用,如果不可用,請直接自己創建文件

這個 sysroot-relativelinks.py 源文件內容,如果找不到就自己整

#!/usr/bin/env python
import sys
import os

# Take a sysroot directory and turn all the abolute symlinks and turn them into
# relative ones such that the sysroot is usable within another system.

if len(sys.argv) != 2:
    print("Usage is " + sys.argv[0] + "<directory>")
    sys.exit(1)

topdir = sys.argv[1]
topdir = os.path.abspath(topdir)

def handlelink(filep, subdir):
    link = os.readlink(filep)
    if link[0] != "/":
        return
    if link.startswith(topdir):
        return
    #print("Replacing %s with %s for %s" % (link, topdir+link, filep))
    print("Replacing %s with %s for %s" % (link, os.path.relpath(topdir+link, subdir), filep))
    os.unlink(filep)
    os.symlink(os.path.relpath(topdir+link, subdir), filep)

for subdir, dirs, files in os.walk(topdir):
    for f in files:
        filep = os.path.join(subdir, f)
        if os.path.islink(filep):
            #print("Considering %s" % filep)
            handlelink(filep, subdir)

4 下載 Qt 庫

自行前往下載 Qt5.14.2 版本,並解壓

cd qt-everywhere-src-5.14.2/qtbase/mkspecs/devices/

你就能看到

其中,進入到 linux-rasp-pi4-v3d-g++,打開 qmake.conf 就可以看到內容輸出

# ./configure -release -opengl es2 -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=~/rpi/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- \
#   -sysroot ~/rpi/sysroot -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix ~/rpi/qt5 -v
#
# Check the configure output carefully. EGLFS, EGLFS GBM, and EGL on X11
# should all be 'yes'. Otherwise something is wrong.

這裏就是官方推薦最基礎的編譯條件,我們需要下載一個交叉編譯器
5 下載交叉編譯器

linaro 下載鏈接
在這裏插入圖片描述
找個地方解壓即可

6 配置 Qt 編譯

這是我的編譯條件

./configure \
-release \
-opengl es2 \
-device linux-rasp-pi4-v3d-g++ \
-device-option \
CROSS_COMPILE=/home/xza/workspace/02_crosstool/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- \
-sysroot /opt/qt5pi/sysroot \
-opensource \
-confirm-license \
-qt-xcb \
-make libs \
-pkg-config \
-prefix /usr/local/qt5pi \
-nomake examples			\
-nomake tests				\
-nomake tools				\
-skip qt3d				\
-skip qtquick3d				\
-skip qtactiveqt			\
-skip qtcanvas3d			\
-skip qtconnectivity			\
-skip qtdatavis3d			\
-skip qtdoc				\
-skip qtgamepad				\
-skip qtlocation			\
-skip qtpurchasing			\
-skip qtsensors				\
-skip qtspeech				\
-skip qttools				\
-skip qtwayland				\
-skip webchannel			\
-skip qtwebengine			\
-skip qtwebglplugin			\
-skip qtwebsockets			\
-skip qtwebview				\
-skip qtmacextras 			\
-skip qtwinextras 			\
-no-use-gold-linker			\
-v 

-qt-xcb 是爲了相較於 xcb 能夠減少對於系統庫的依賴
-skip 是不需要的庫
其中 qtwayland 可以去掉沒有必要
-no-use-gold-linker 和 -v 是官方推薦加上


./build_qt.sh
這個是自己寫的執行腳本

編譯完成之後請檢查,輸出

EGL on X11 , EGLFS GBM , EGLFS 三個都是 yes
基本如圖所示,配置算是完成完成了
執行 make -j8
執行 make install
到這裏交叉編譯完成

在這裏插入圖片描述

如果提示失敗,最好選擇刪掉整個文件夾,然後重新解壓一個再試試看
如果失敗,應該大概率是 /opt/qt5pi/sysroot 下的庫缺失,可以試試這個配置

sudo apt-get build-dep qt5-qmake

sudo apt-get install libboost1.58-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev

sudo apt-get install libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev libegl1-mesa-dev libgbm-dev libgles2-mesa-dev mesa-common-dev

sudo apt-get install libasound2-dev libpulse-dev gstreamer1.0-omx libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-alsa

sudo apt-get install libvpx-dev libsrtp0-dev libsnappy-dev libnss3-dev

sudo apt-get install "^libxcb.*"

sudo apt-get install libfreetype6-dev libicu-dev libsqlite3-dev libxslt1-dev libavcodec-dev libavformat-dev libswscale-dev

sudo apt-get install libgstreamer0.10-dev gstreamer-tools libraspberrypi-dev libx11-dev libglib2.0-dev

sudo apt-get install freetds-dev libsqlite0-dev libpq-dev libiodbc2-dev firebird-dev libjpeg9-dev libgst-dev libxext-dev libxcb1 libxcb1-dev libx11-xcb1

sudo apt-get install libxcb-sync1 libxcb-sync-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev

sudo apt-get install libxcb-glx0-dev libxi-dev libdrm-dev libssl-dev libxcb-xinerama0 libxcb-xinerama0-dev

sudo apt-get install libatspi-dev libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libfontconfig1-dev

sudo apt-get install libxss-dev libxtst-dev libpci-dev libcap-dev libsrtp0-dev libxrandr-dev libnss3-dev libdirectfb-dev libaudio-dev
7 同步回樹莓派

注意: 已經在 樹莓派上 /usr/local 下創建 qt5pi

執行這句指令:
rsync -avz sysroot/usr/local/qt5pi [email protected]:/usr/local


總結

到此,全部配置編譯都已經完成了,可以進行交叉編譯了,這部分不再詳細說明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章