因為工作的需要,終於要在嵌入式系統上導入 QT 了,因為要用彩色LCD,以前那種黑白自己還可以自己一點一點的硬刻,彩色的再這樣搞太累了。而且可以導入 QT 的元件,也是有點好處,就是比較肥,一開始跑起來會慢一點。
這邊的圖型 backend 是用 Framebuffer (Virtual Framebuffer),等 QT 寫入 VFB 的 RAM 後,我再用 DMA 去寫進 LCD 的 SPI,不過這是理論上,也還沒做好。但 ARM64 上的 QT 好了,就先 Po 篇文以免忘記吧。
我記得這個流程好像也是問 AI 的,大家就參考參考吧
腳本
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#!/usr/bin/env bash # Qt 5.12.x → Linux aarch64,linuxfb only(無 X/Wayland/OpenGL/DBus/ICU/SSL) # Ubuntu 24.04 / Noble;使用 *-arm64-cross 套件;不需要 multiarch:arm64 # 將 QT_TAG 改成 v5.12.12 也可 set -euo pipefail QT_TAG="v5.12.8" # 可改 v5.12.12 PREFIX="/opt/qt5-aarch64" JOBS="$(nproc)" echo "[1/5] 安裝交叉工具與 arm64-cross 標頭" sudo apt-get update sudo apt-get install -y \ g++-aarch64-linux-gnu binutils-aarch64-linux-gnu \ libc6-dev-arm64-cross linux-libc-dev-arm64-cross \ git make perl python3 cmake ninja-build \ wget unzip xz-utils echo "[2/5] 設定交叉環境" export CC=aarch64-linux-gnu-gcc export CXX=aarch64-linux-gnu-g++ export AR=aarch64-linux-gnu-ar export STRIP=aarch64-linux-gnu-strip echo "[3/5] 抓 Qt5 超級倉庫(用 tag,而非分支)" mkdir -p ~/src && cd ~/src if [ -d qt5 ]; then rm -rf qt5 fi git clone https://code.qt.io/qt/qt5.git --depth 1 --branch "${QT_TAG}" qt5 # 若 code.qt.io 慢,可改 mirror: # git clone https://github.com/qt/qt5.git --depth 1 --branch "${QT_TAG}" qt5 cd qt5 # 只取 qtbase(最小化),日後需要再加模組 perl init-repository --module-subset=qtbase -f sed -i '0,/#include <QtCore\/qglobal.h>/s//#include <QtCore\/qglobal.h>\n#include <limits>/' \ ./qtbase/src/corelib/global/qendian.h sed -i '/#define QGLOBAL_H/a #ifdef __cplusplus \n#include <limits> \n#endif' \ ./qtbase/src/corelib/global/qglobal.h echo "[4/5] 配置 + 編譯(只 linuxfb + evdev;關掉 X/Wayland/EGL/GL 等)" BUILD_DIR="build-qt512-aarch64-linuxfb" mkdir -p "${BUILD_DIR}" && cd "${BUILD_DIR}" ../qtbase/configure \ -opensource -confirm-license -release \ -prefix "${PREFIX}" \ -nomake tests -nomake examples \ -xplatform linux-aarch64-gnu-g++ \ -device-option CROSS_COMPILE=aarch64-linux-gnu- \ -no-warnings-are-errors \ -linuxfb \ -static \ -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype -qt-harfbuzz \ -no-xcb -no-xkbcommon -no-eglfs -no-opengl \ -no-icu -no-dbus -no-glib -no-openssl make -j"${JOBS}" sudo make install echo "[5/5] 驗證輸出(linuxfb 外掛是否存在)" test -f "${PREFIX}/plugins/platforms/libqlinuxfb.so" && echo "OK: 有 libqlinuxfb.so" || echo "警告:找不到 libqlinuxfb.so" cat <<'USAGE' === 使 用 提 示 === 在 aarch64 目標機(或 qemu-aarch64)上: export QT_QPA_PLATFORM=linuxfb # 或: ./your_app -platform linuxfb:fb=/dev/fb0 # 輸入(鍵盤/滑鼠/觸控)使用 evdev: export QT_QPA_GENERIC_PLUGINS="evdevkeyboard,evdevmouse,evdevtouch" # 或在命令列加: -plugin evdevkeyboard -plugin evdevmouse # 目標系統需要有 /dev/fb0 與 /dev/input/event* 權限。 USAGE |



