インストール - Qt5 Raspberry Pi

2024年3月25日 (月) 22:11時点におけるWiki (トーク | 投稿記録)による版 (→‎Raspberry Piの設定)

概要

Raspberry Piにおいて、一般的なデスクトップソフトウェアのクロスコンパイルおよび組み込み / デバイス作成のユースケースのクロスコンパイルを行う手順を記載する。

組み込み / デバイス作成とは、デスクトップソフトウェアをX11の下で実行するためのものではなく、
ソフトウェアがBroadcomドライバを使用して、dispmanx / EGLの上でフルスクリーンで実行するというユースケースのことである。

EGLを使用する場合、Qtソフトウェアはフルスクリーンでのみ動作する。
一般的なデスクトップウインドウで起動する場合はXCBを使用する必要があるが、XCBはOpenGLやQt Quickは動作しないことに注意すること。

このページでは、Raspberry Pi OS Bullseye / Bookwarmをインストールしていることを想定している。


ホストPCの設定

ホストPCにおいて、クロスコンパイルに必要なライブラリをインストールする。
(Texinfoは、GNU公式Webサイトにアクセスして、ソースコードからインストールすることを推奨する)

sudo zypper install autoconf automake cmake unzip tar git wget pkg-config gperf gcc gcc-c++ \
                    gawk bison openssl flex figlet pigz ncurses-devel ncurses5-devel texinfo


GCC ARMツールチェーンにおいて、GCC 8以降が必要である
Linaroは、アップストリームビルドのスナップショットをユーザに提供するGNUツールチェーン・インテグレーションビルドを毎月提供している。
これらのビルドにより、開発者はビルド済みバイナリの機能をアップストリームですぐにテストすることができる。

Linero社が提供しているGCC ARMツールチェーンをダウンロードする。

※注意
クロスコンパイラのlibstdc++.so.6ファイルにおいて、Raspberry Pi OSのlibstdc++.so.6ファイルのバージョンと同等または古いものを使用する必要がある。
例えば、Raspberry Pi OS Bullseyeのlibstdc++.so.6ファイルはGLIBCXX_3.4.28までであるため、GCC 10ツールチェーン、または、それ以前のものを使用する。


# 32ビット向け
tar xf gcc-linaro-<バージョン>-x86_64_arm-linux-gnueabihf.tar.xz

# 64ビット向け
tar xf gcc-linaro-<バージョン>-x86_64_aarch64-linux-gnu.tar.xz


また、開発者がGCC ARMツールチェーンを作成する場合、インストール - GCC#クロスコンパイラ向けGCCツールチェーンのインストールを参照すること。

GCC ARMツールチェーンは、システム固有のLTO(Link Time Optimization)フラグを使用して構築されているため、
ソフトウェアをコンパイルする時、これらのツールチェーンを使用することで、Raspberry PiのSoC固有の機能を簡単に利用することができる。

Raspberry Pi 4のSoCはBroadcom BCM2711 SoC(Cortex-A72 64bit)を採用しており、Raspberry Pi 3B / 3B+と同様、ARMv8-aアーキテクチャを採用している。

表. Raspberry PiとLTO(Link Time Optimization)フラグの関係
Raspberry Piの種類 LTO(Link Time Optimization)フラグ
Raspberry Pi Zero/W/WH
Raspberry Pi 1 Model A / B / A+ / B+
-march=armv6 -mfloat-abi=hard -mfpu=vfp
Raspberry Pi 2 Model A / B -march=armv7-a -mfloat-abi=hard -mfpu=neon-vfpv4
Raspberry Pi 3 Model A, A+ / B, B+ (32Bit)
Raspberry Pi 4 Model A+ / B+ (32Bit)
Raspberry Pi Compute 3 / 3lite / 3+ (32Bit)
-march=armv8-a -mfloat-abi=hard -mfpu=neon-fp-armv8
Raspberry Pi 3 Model A+ / B+ (64Bit)
Raspberry Pi 4 Model A+ / B+ (64Bit)
Raspberry Pi Compute 3 / 3lite / 3+ (64Bit)
-march=armv8-a+fp+simd



Raspberry Piの設定

描画処理に時間が掛かる場合、Raspberry PiのVRAMを128[MB]や256[MB]程度に変更する。

  • VRAMを変更する手順
    sudo raspi-config
    次に、[Performance Options] - [GPU Memory]を選択して、任意の数値を入力する。
    最後に、[Finish]を選択して終了する。


Raspberry Pi 4Bでは、Broadcom EGLはサポートされていないため、Qt 5を使用する場合は、KMSを有効にする必要がある。
また、KMSを有効にするには、libgles2-mesa-devライブラリとlibgbm-devライブラリをインストールする必要がある。

  • GL(FAKE KMS)を有効にする手順
    sudo raspi-config
    次に、[Advanced Options] - [A8 GL Driver] - [G2 GL (Fake KMS)]を選択することにより、KMSが有効になる。
    最後に、[Finish]を選択して終了する。
    (最小限のビルドを使用する場合、このオプションが利用可能になる前に、いくつかのアップデートを促される時はアップデートする。


次に、/etc/apt/sources.listファイルのdeb-srcから始まる行のコメントを外す。

sudo vi /etc/apt/sources.list


# /etc/apt/sources.listファイル

# Bullseyeの場合
## 編集前
#deb-src http://raspbian.raspberrypi.org/raspbian/ bullseye main contrib non-free rpi

## 編集後
deb-src http://raspbian.raspberrypi.org/raspbian/ bullseye main contrib non-free rpi


Raspbian Busterのソフトウェアをアップデートする。

sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot


Raspberry Piのファームウェアをアップデートする。
ただし、不要の場合もあることに注意する。

sudo rpi-update
sudo reboot


Raspberry PiにQtライブラリをインストールする。
build-depコマンドとは、ビルドに必要なパッケージが全てインストールするコマンドである。
ビルド設定によっては、不要なパッケージも含まれている。

# Raspberry Pi OS Bullseye
## EGLを使用する場合
sudo apt install ccache libicu-dev icu-devtools libsctp1 libsctp-dev libzstd1 libzstd-dev libhidapi-dev \
                 libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                 libblkid-dev libffi-dev libglib2.0-dev libglib2.0-dev-bin libmount-dev \
                 libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libselinux1-dev libsepol1-dev libwacom-dev \
                 libfontconfig1-dev libdbus-1-dev libnss3-dev libxkbcommon-dev libjpeg-dev libasound2-dev libudev-dev libgles2-mesa-dev \
                 libxcb-xinerama0 libxcb-xinerama0-dev gdbserver
                 python2 libpython2.7  # QtQuickを使用する場合
                 libgtk-3-dev          # QtWidget向けにGTKネイティブテーマを使用する場合
                 libraspberrypi-dev    # 32ビットOSを使用する場合

## XCBを使用する場合
sudo apt install ccache libicu-dev icu-devtools libsctp1 libsctp-dev libzstd1 libzstd-dev libhidapi-dev \
                 libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                 libblkid-dev libffi-dev libglib2.0-dev libglib2.0-dev-bin libmount-dev \
                 libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libselinux1-dev libsepol1-dev libwacom-dev \
                 libfontconfig1-dev libdbus-1-dev libnss3-dev libxkbcommon-dev libjpeg-dev libasound2-dev libudev-dev libgles2-mesa-dev \
                 libxcb-xinerama0 libxcb-xinerama0-dev gdbserver \
                 libx11-dev libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev \
                 libfreetype6-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev \
                 libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev \
                 libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util0-dev \
                 libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libfontconfig1-dev 
                 python2 libpython2.7  # QtQuickを使用する場合
                 libgtk-3-dev          # QtWidget向けにGTKネイティブテーマを使用する場合
                 libraspberrypi-dev    # 32ビットOSを使用する場合

sudo apt build-dep libqt5webengine-data  # WebEngineを使用する場合
sudo apt build-dep libqt5webkit5         # WebKitを使用する場合


マルチメディア関連やBluetooth等を使用する場合、下表に示す任意のパッケージをインストールする。

その他のライブラリ(オプション)
機能 インストールするライブラリ configureスクリプトのオプション
Bluetooth bluez bluez-tools libbluetooth-dev
画像 libjpeg-dev libpng-dev libtiff-dev libwebp-dev libmng-dev libjasper-dev
コーデック libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libx265-dev
マルチメディア libgstreamer1.0-0 libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base
gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad
libgstreamer-plugins-bad1.0-dev gstreamer1.0-libav gstreamer1.0-pulseaudio gstreamer1.0-tools
gstreamer1.0-alsa gstreamer1.0-x gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5
libwayland-dev(Wayland開発パッケージは、gstreamerヘッダで必要)
ALSAオーディオ libasound2-dev
Pulseオーディオ pulseaudio libpulse-dev
OpenALオーディオ libopenal-data libopenal1 libopenal-dev libsndio7.0 libsndio-dev
データベース unixodbc-dev (ODBC)
libsqlite3-dev (SQLite)
libpq-dev(PostgreSQL)
libmariadb-dev(MariaDB / MySQL)
プリンタ libcups2-dev
Qt Speech flite1-dev
Qt GamePad libsdl2-dev
Wayland libwayland-dev libwayland-dev libkwaylandserver-dev waylandpp-dev libwayland-egl-backend-dev
X11 libx11-dev libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev
libfreetype6-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev
libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev
libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util0-dev
libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libfontconfig1-dev

もし、xcbに関連するパッケージを全てインストールする場合は、sudo apt install "libxcb-*"を実行する。
WebEngine 必須 :
flex bison gperf libre2-dev libnss3-dev libdrm-dev

オプション1 :
libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev libevent-dev libprotobuf-dev
protobuf-compiler

オプション2(不安定なため注意すること) :
libopus-dev libvpx-dev
アクセシビリティ at-spi2-core libatspi2.0-dev gir1.2-atspi-2.0
SCTP libsctp1 libsctp-dev -sctp
Broadcom EGLの代わりに
VC4ドライバを使用する場合

※Raspberry Pi 4では必須
libgles2-mesa-dev libgbm-dev -platform linux-rpi-vc4-g++


ビルドしたQtソフトウェアをRasberry Piにデプロイするためのディレクトリを作成する。
加えて、Qtライブラリを配置するディレクトリも作成する。

mkdir -p ~/InstallSoftware/QtApplication ~/InstallSoftware/Qt_5_x_x_EGL ~/InstallSoftware/Qt_5_x_x_XCB


次のセクションにおいて、rsyncコマンドを使用してLinux PCとRaspberry Piのファイルを同期する。
しかし、同期するファイルには、スーパユーザ権限が必要なものがある。

そのため、一般ユーザでも全てのファイルを同期できるように、/etc/sudoersファイルに以下の設定を追記する。
以下の設定により、rsyncコマンドは、必要に応じてスーパユーザ権限で実行される。

echo "$USER ALL=NOPASSWD:$(which rsync)" | sudo tee --append /etc/sudoers



EGLFSを使用する場合

Raspberry Pi OS Bullseye以降、Broadcommグラフィックライブラリ (/opt/vcディレクトリ) は存在しない。
もし、brcmEGLライブラリ等が必要な場合は、手動でビルドおよびインストールする必要がある。

git clone https://github.com/raspberrypi/userland
cd userland


Broadcommグラフィックライブラリをビルドおよびインストールする。

./buildme


/opt/vcディレクトリにBroadcommグラフィックライブラリがインストールされているかどうかを確認する。


システムルートディレクトリの設定

Linux PCで、Raspberry Pi向けのQtソフトウェアをクロスコンパイルできるように開発環境を設定する。
Raspberry Pi上でネイティブにコンパイルすることもできるが、Linux PCの方がスループットが良い。

Linux PC上に開発用ディレクトリを作成する。
また、Raspberry Piのいくつかのルートディレクトリと同期する必要があるため、システムルートディレクトリも作成する。

mkdir -p ~/Program/Qt_Embedded/sysroot ~/Program/Qt_Embedded/sysroot/lib ~/Program/Qt_Embedded/sysroot/opt \
         ~/Program/Qt_Embedded/sysroot/usr ~/Program/Qt_Embedded/sysroot/usr/share 


rsyncコマンドを使用して、Raspberry Piに存在するいくつかのディレクトリから、ファイルをダウンロードする。

rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/lib ~/Program/Qt_Embedded/sysroot
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/usr/include ~/Program/Qt_Embedded/sysroot/usr
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/usr/lib ~/Program/Qt_Embedded/sysroot/usr
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/usr/share/pkgconfig ~/Program/Qt_Embedded/sysroot/usr/share


ダウンロードしたファイルおよびディレクトリのシンボリックリンクを相対的に調整する。
fixQualifiedLibraryPathsが正常に動作しないため、提供されたスクリプトをダウンロードして実行する。

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py ~/Program/Qt_Embedded/sysroot



Qtライブラリのダウンロード

まず、Qtライブラリのソースコードをダウンロードする。

以下のコマンドにおいて、<Qtのバージョン>および<Qtのショートバージョン>は、ダウンロードするQtのバージョンに変更する。
例えば、Qt 5.15.13をダウンロードする場合、5.15.13と入力する。Qt 5.15の最新版をダウンロードする場合、5.15と入力する。

  • QtBaseをダウンロードする場合
    cd ~/Program/Qt_Embedded
    git clone git://code.qt.io/qt/qtbase.git -b <Qtのバージョン>
    または
    git clone https://github.com/qt/qtbase -b <Qtのバージョン>

  • Qt Everywhere Opensourceをビルドする場合
    wget https://download.qt.io/official_releases/qt/x.x/x.x.x/single/qt-everywhere-src-x.x.x.tar.xz
    tar xf qt-everywhere-opensource-src-x.x.x.tar.gz
    cd qt-everywhere-opensource-src-x.x.x

  • Githubからソースコードをダウンロードする場合
    QtのGithubでは、より多くの新しいアップデートが行われている。
    git clone https://github.com/qt/qt5.git
    cd qt5
    git checkout <Qtのバージョン>またはgit checkout <Qtのショートバージョン>

    init-repositoryコマンドは、Qtが提供する指定したモジュールのソースコードを取得するためのツールである。
    super-repoはそれ自体は小さく、他の全てはgit submodulesとして保持されている。
    利用可能な全てのモジュールについてはこちらのWebサイト、ツールについてはinit-repository --helpコマンドまたはこちらのWebサイトを参照すること。
    ./init-repository --module-subset=essential



デバイス定義ファイルの作成

EGLFSを使用する場合

qmake.confを作成する。
qmake.confファイルは、ビルド時の設定を定義するものである。

cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
mkdir linux-raspberrypi-new-g++ && cd linux-raspberrypi-new-g++
vi qmake.conf


 # qmake.confファイル
 
 include(../common/linux_device_pre.conf)
 
 SYSROOT_INC = $$[QT_SYSROOT]/usr/include
 SYSROOT_LIB = $$[QT_SYSROOT]/usr/lib
 
 # Extra stuff (OpenGL, DirectFB, ...)
 QMAKE_INCDIR_EGL        = $$[SYSROOT_INC] \
                           $$[SYSROOT_INC]/arm-linux-gnueabihf \
                           $$[SYSROOT_INC]/GL \
                           $$[SYSROOT_INC]/EGL \
                           $$[SYSROOT_INC]/GLES \
                           $$[SYSROOT_INC]/GLES2 \
                           $$[SYSROOT_INC]/GLES3 \
                           $$[SYSROOT_INC]/GLFW
 QMAKE_LIBDIR_EGL        = $$[SYSROOT_LIB] \
                           $$[SYSROOT_LIB]/arm-linux-gnueabihf
 QMAKE_INCDIR_OPENGL_ES2 = $$[QMAKE_INCDIR_EGL]
 QMAKE_LIBDIR_OPENGL_ES2 = $${QMAKE_LIBDIR_EGL}
 QMAKE_INCDIR_OPENVG     = $${QMAKE_INCDIR_EGL}
 QMAKE_LIBDIR_OPENVG     = $${QMAKE_LIBDIR_EGL}
 
 QMAKE_LIBS_EGL          = -lEGL
 QMAKE_LIBS_OPENGL_ES2   = -lGLESv2 $${QMAKE_LIBS_EGL}
 QMAKE_LIBS_OPENVG       = -lOpenVG $${QMAKE_LIBS_EGL}
 
 # Raspberry Pi 3B / 3B+の場合
 QMAKE_CFLAGS             = -march=armv8-a -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8
 
 # Raspberry Pi 4Bの場合
 QMAKE_CFLAGS             = -march=armv8-a -mtune=cortex-a72 -mfpu=crypto-neon-fp-armv8
 
 QMAKE_CFLAGS             = $${COMPILER_FLAGS}
 QMAKE_CXXFLAGS           = $${COMPILER_FLAGS}
 QMAKE_CXXFLAGS_RELEASE  += -O3
 
 QMAKE_LIBS              += -lrt -lpthread -ldl
 
 # Raspberry Pi OS 32ビットの場合
 # Raspberry Pi OS 64ビットの場合はコメントアウトする
 DISTRO_OPTS             += hard-float
 
 # Raspberry Pi OS 64ビットの場合はコメントを解除する
 #DISTRO_OPTS += aarch64
 
 # for Raspberry Pi OS
 DISTRO_OPTS             += deb-multi-arch
 
 # Preferred eglfs backend
 ## Raspberry Pi 3B / 3B+の場合
 EGLFS_DEVICE_INTEGRATION = eglfs_brcm
 
 ## Raspberry Pi 4Bの場合
 EGLFS_DEVICE_INTEGRATION = eglfs_kms
 
 include(../common/linux_arm_device_post.conf)
 
 load(qt_config)


次に、デバイス定義ファイルのヘッダファイルを作成する。

vi qplatformdefs.h


 # qplatformdefs.hファイル
 
 #include "../../linux-g++/qplatformdefs.h"


XCBを使用する場合

qmake.confを作成する。
qmake.confファイルは、ビルド時の設定を定義するものである。

cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
mkdir linux-raspberrypi-new-g++ && cd linux-raspberrypi-new-g++
vi qmake.conf


 # qmake.confファイル
 
 include(../common/linux_device_pre.conf)
 
 SYSROOT_INC = $$[QT_SYSROOT]/usr/include
 SYSROOT_LIB = $$[QT_SYSROOT]/usr/lib
 
 # Extra stuff (OpenGL, DirectFB, ...)
 QMAKE_INCDIR_EGL        = $$[SYSROOT_INC] \
                           $$[SYSROOT_INC]/arm-linux-gnueabihf \
                           $$[SYSROOT_INC]/GL \
                           $$[SYSROOT_INC]/EGL \
                           $$[SYSROOT_INC]/GLES \
                           $$[SYSROOT_INC]/GLES2 \
                           $$[SYSROOT_INC]/GLES3 \
                           $$[SYSROOT_INC]/GLFW
 QMAKE_LIBDIR_EGL        = $$[SYSROOT_LIB] \
                           $$[SYSROOT_LIB]/arm-linux-gnueabihf
 QMAKE_INCDIR_OPENGL_ES2 = $$[QMAKE_INCDIR_EGL]
 QMAKE_LIBDIR_OPENGL_ES2 = $${QMAKE_LIBDIR_EGL}
 QMAKE_INCDIR_OPENVG     = $${QMAKE_INCDIR_EGL}
 QMAKE_LIBDIR_OPENVG     = $${QMAKE_LIBDIR_EGL}
 
 QMAKE_LIBS_EGL          = -lEGL
 QMAKE_LIBS_OPENGL_ES2   = -lGLESv2 $${QMAKE_LIBS_EGL}
 QMAKE_LIBS_OPENVG       = -lOpenVG $${QMAKE_LIBS_EGL}
 
 # Raspberry Pi 3B / 3B+の場合
 QMAKE_CFLAGS             = -march=armv8-a -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8
 
 # Raspberry Pi 4Bの場合
 QMAKE_CFLAGS             = -march=armv8-a -mtune=cortex-a72 -mfpu=crypto-neon-fp-armv8
 
 QMAKE_CFLAGS             = $${COMPILER_FLAGS}
 QMAKE_CXXFLAGS           = $${COMPILER_FLAGS}
 QMAKE_CXXFLAGS_RELEASE  += -O3
 
 QMAKE_LIBS              += -lrt -lpthread -ldl
 
 # Raspberry Pi OS 32ビットの場合
 # Raspberry Pi OS 64ビットの場合はコメントアウトする
 DISTRO_OPTS             += hard-float
 
 # Raspberry Pi OS 64ビットの場合はコメントを解除する
 #DISTRO_OPTS += aarch64
 
 # for Raspberry Pi OS
 DISTRO_OPTS             += deb-multi-arch
 
 # Preferred eglfs backend
 EGLFS_DEVICE_INTEGRATION = eglfs_kms
 
 include(../common/linux_arm_device_post.conf)
 
 load(qt_config)


次に、デバイス定義ファイルのヘッダファイルを作成する。

vi qplatformdefs.h


 # qplatformdefs.hファイル
 
 #include "../../linux-g++/qplatformdefs.h"



Qtライブラリのビルド

ビルドおよびインストールされるQtライブラリは、以下に示すように2種類存在する。

  • ホストPC向けQtライブラリ
  • ターゲットデバイス向けQtライブラリ


Qt 5をクロスビルドおよびインストールする。
Qt 5.8以降は、-no-use-gold-linkerオプションを付加する必要がある。

# EGLFSの場合

# ビルドディレクトリを作成
mkdir /<Qtのソースコードがあるディレクトリ>/../build && cd /<Qtのソースコードがあるディレクトリ>/../build

export CROSS_PI_PATH=/<GCC ARMツールチェインのインストールディレクトリ>

# Raspberry Pi OS 32ビットの場合
export CROSS_COMPILE=$CROSS_PI_PATH/bin/arm-linux-gnueabihf-

# Raspberry Pi OS 64ビットの場合
export CROSS_COMPILE=$CROSS_PI_PATH/bin/aarch64-linux-gnu-

# システムルードディレクトリの指定
export SYSTEMROOT=<Raspberry Pi OSのシステムルートディレクトリ>
export PKG_CONFIG_SYSROOT_DIR=$SYSTEMROOT

export PKG_CONFIG_PATH=$PKG_CONFIG_SYSROOT_DIR/usr/lib/pkgconfig:$PKG_CONFIG_SYSROOT_DIR/usr/lib/arm-linux-gnueabihf/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_SYSROOT_DIR/usr/lib/pkgconfig:$PKG_CONFIG_SYSROOT_DIR/usr/lib/arm-linux-gnueabihf/pkgconfig:$PKG_CONFIG_SYSROOT_DIR/usr/share/pkgconfig

../qt-everywhere-src-5.15.13/configure -release  \
-device linux-raspberrypi-new-g++                       \
-device-option CROSS_COMPILE=$CROSS_COMPILE             \
-opensource -confirm-license -v                         \
-opengl es2 -eglfs                                      \  # EGLを使用する場合
-qpa eglfs                                              \  # EGLを使用する場合
-nomake examples -no-compile-examples -nomake tests -make libs -no-use-gold-linker -recheck-all \
-skip qtwebengine -skip qtandroidextras -skip qtmacextras -skip qtwinextras                     \
-sysroot $SYSTEMROOT                                            \
-prefix /<Qtソフトウェアを配置するディレクトリ>                            \
-extprefix /<Raspberry PiにインストールするQtライブラリを配置するディレクトリ> \
-hostprefix /<Linux PCで使用するQtライブラリを配置するディレクトリ>         \
-I$SYSTEMROOT/usr/include/arm-linux-gnueabihf                   \  # Raspberry Pi OS 32ビットの場合
-L$SYSTEMROOT/usr/lib/arm-linux-gnueabihf                          # Raspberry Pi OS 32ビットの場合
-I$SYSTEMROOT/usr/include/aarch64-linux-gnu                     \  # Raspberry Pi OS 64ビットの場合
-L$SYSTEMROOT/usr/lib/aarch64-linux-gnu                            # Raspberry Pi OS 64ビットの場合


# XCBの場合

# ビルドディレクトリを作成
mkdir /<Qtのソースコードがあるディレクトリ>/../build && cd /<Qtのソースコードがあるディレクトリ>/../build

export CROSS_PI_PATH=/<GCC ARMツールチェインのインストールディレクトリ>

# Raspberry Pi OS 32ビットの場合
export CROSS_COMPILE=$CROSS_PI_PATH/bin/arm-linux-gnueabihf-

# Raspberry Pi OS 64ビットの場合
export CROSS_COMPILE=$CROSS_PI_PATH/bin/aarch64-linux-gnu-

# システムルードディレクトリの指定
export SYSTEMROOT=<Raspberry Pi OSのシステムルートディレクトリ>
export PKG_CONFIG_SYSROOT_DIR=$SYSTEMROOT

export PKG_CONFIG_PATH=$PKG_CONFIG_SYSROOT_DIR/usr/lib/pkgconfig:$PKG_CONFIG_SYSROOT_DIR/usr/lib/arm-linux-gnueabihf/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_SYSROOT_DIR/usr/lib/pkgconfig:$PKG_CONFIG_SYSROOT_DIR/usr/lib/arm-linux-gnueabihf/pkgconfig:$PKG_CONFIG_SYSROOT_DIR/usr/share/pkgconfig

../qt-everywhere-src-5.15.13/configure -release  \
-device linux-raspberrypi-new-g++                       \
-device-option CROSS_COMPILE=$CROSS_COMPILE             \
-opensource -confirm-license -v                         \
-opengl es2                                             \  # XCBを使用する場合
-qpa xcb                                                \  # XCBを使用する場合
-nomake examples -no-compile-examples -nomake tests -make libs -no-use-gold-linker -recheck-all \
-skip qtwebengine -skip qtandroidextras -skip qtmacextras -skip qtwinextras                     \
-sysroot $SYSTEMROOT                                            \
-prefix /<Qtソフトウェアを配置するディレクトリ>                            \
-extprefix /<Raspberry PiにインストールするQtライブラリを配置するディレクトリ> \
-hostprefix /<Linux PCで使用するQtライブラリを配置するディレクトリ>         \
-I$SYSTEMROOT/usr/include/arm-linux-gnueabihf                   \  # Raspberry Pi OS 32ビットの場合
-L$SYSTEMROOT/usr/lib/arm-linux-gnueabihf                          # Raspberry Pi OS 32ビットの場合
-I$SYSTEMROOT/usr/include/aarch64-linux-gnu                     \  # Raspberry Pi OS 64ビットの場合
-L$SYSTEMROOT/usr/lib/aarch64-linux-gnu                            # Raspberry Pi OS 64ビットの場合


# 共通
gmake -j $(nproc)
gmake install


もし、Linux PCで使用するQtライブラリを配置するディレクトリにrccファイルが存在しない場合は、rccファイルをQtライブラリのbinディレクトリにコピーする。
これは、Qtライブラリを使用するプログラムをビルドする場合は、rccファイルが必要となるためである。

cp /<Qtのソースコードがあるディレクトリ>/qtbase/bin/rcc /<ホストPCで使用するQtライブラリを配置するディレクトリ>/bin



Qtライブラリのデプロイ

ビルドしたQtライブラリを、Raspberry Piにデプロイする。
~/Program/Qt_Embedded/Qt5ディレクトリに存在する全てのファイルを、Raspberry Piの/usr/localディレクトリに同期させる。

rsync -avz --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" \
~/Program/Qt_Embedded/Target <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/home/<Raspberry Piのユーザ名>/InstallSoftware/Qt_5_x_x


※注意
Raspberry PiにアップロードしたQtライブラリの所有者がrootになっている場合があるため、
以下のコマンドを実行して、所有者をローカルユーザに変更する必要がある。

sudo chown -R <Raspberry Piのユーザ名>:<Raspberry Piのグループ名> ~/InstallSoftware/Qt_5_x_x


Raspberry PiのリンカがQtライブラリを読み込むようにするため、以下のコマンドを実行する。
/etc/ld.so.conf.dディレクトリに配置する場合、Raspberry Pi 2B / 3Bでは、ファイル名の先頭に"00"を付加すること。

# .profileファイルに設定する場合
export LD_LIBRARY_PATH="/home/<Raspberry Piのユーザ名>/InstallSoftware/Qt_5_x_x/lib:$LD_LIBRARY_PATH"

# /etc/ld.so.conf.dディレクトリに配置する場合
echo /home/<Raspberry Piのユーザ名>/InstallSoftware/Qt_5_x_x/lib | sudo tee /etc/ld.so.conf.d/00-Qt_5_x_x.conf
sudo ldconfig


これにより、Raspberry PiでQtライブラリが使用できる。


Qtライブラリの動作確認

Qtソフトウェアを開発して、動作確認を行う。

XCBを使用する場合 : Raspbian OS Buster以前

Raspberry PiのEGL / GLESライブラリを修正する。

Raspberry Piの/usr/lib/arm-linux-gnueabihfディレクトリには、MesaのlibEGLとlibGLESv2が存在する。
XCBを使用したQtソフトウェアは、/opt/vc/libディレクトリにあるlibbrcmEGLとlibbrcmGLESv2ではなく、libEGLとlibGLESv2が自動的に選択される。
しかし、MesaのlibEGLとlibGLESv2は、OpenGLの描画処理と関わりがあるEGLでは、ほとんど役に立たない。(XCBは、OpenGLの描画処理とほぼ関係無い)

そのため、libbrcmEGLとlibbrcmGLESv2を、libEGLとlibGLESv2に入れ替える。
具体的には、libbrcmEGLとlibbrcmGLESv2のシンボリックリンクを/usr/lib/arm-linux-gnueabihfディレクトリに作成する。
(必ず、元のファイルはバックアップすること)

sudo ln -sf /opt/vc/lib/libbrcmEGL.so /opt/vc/lib/libEGL.so
sudo ln -sf /opt/vc/libbrcmGLESv2.so /opt/vc/libGLESv2.so

sudo ln -sf /opt/vc/lib/libEGL.so                    /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1 /usr/lib/arm-linux-gnueabihf/libEGL.so

sudo ln -sf /opt/vc/lib/libGLESv2.so                    /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 /usr/lib/arm-linux-gnueabihf/libGLESv2.so


上記で設定したライブラリを読み込むため、以下のコマンドを実行する。

sudo ldconfig


上記のシンボリックリンクの設定を元に戻す場合は、以下のように実行する。

sudo rm -rf /opt/vc/lib/libEGL.so /opt/vc/libGLESv2.so

sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1     /usr/lib/arm-linux-gnueabihf/libEGL.so

sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2     /usr/lib/arm-linux-gnueabihf/libGLESv2.so


次に、Qt Creatorでソフトウェアを開発する時の環境設定を行う。
Qt Creatorを起動して、Qt Creatorメイン画面左の[プロジェクト] - 左ペインの[Run] - 右ペインの[ビルド設定] - [Environment]項目 - [詳細]プルダウンを開く。
[詳細]プルダウンから[追加]ボタンを押下して、以下の項目を設定する。

  • Variable - QT_QPA_PLATFOMRTHEME
    Value - qt5ct
  • Variable - DISPLAY
    Value - :0 または :0.0
  • Variable - XAUTHORITY
    Value - /home/<Raspberry Piのユーザ名>/.Xauthrity
  • Variable - XDG_SESSION_TYPE
    Value - x11


さらに、Raspberry Piの~/.profileファイルまたは~/.bashrcファイルに、以下の設定を追記する。

export QT_QPA_PLATFOMRTHEME=qt5ct
export DISPLAY=:0 または export DISPLAY=:0.0
export XAUTHORITY=/home/<Raspberry Piのユーザ名>/.Xauthrity
export XDG_SESSION_TYPE=x11



Qtライブラリを個別にインストールする場合

Qtライブラリを個別にインストールする場合は、ライブラリを個別にダウンロードしてインストールする。
<Qtライブラリ>と<Qtのバージョン>は合致するものを指定すること。

git clone https://github.com/qt/<Qtライブラリ名>.git -b <Qtのバージョン>
# または
git clone https://code.qt.io/cgit/qt/<Qtライブラリ名>.git -b <Qtのバージョン>

cd <Qtライブラリ名>

~/Program/Qt_Embedded/Qt5/bin/qmake
make -j $(nproc)
make install


QtライブラリをRaspberry Piにデプロイする。

rsync -avz --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" /<Qtライブラリを配置するディレクトリ> \
      <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/home/<Raspberry Piのユーザ名>/<Qtライブラリをインストールするディレクトリ>



エラー関連

: ビルドエラー

Qt 5のビルドにおいて、以下に示すようなエラーが表示される場合がある。

qt-everywhere-src-5.15.x/qtbase/src/plugins/platforms/eglfs/deviceintegration/eglfs_brcm/qeglfsbrcmintegration.cpp:74:5: Error: »EGL_DISPMANX_WINDOW_T« was not declared in this scope
     EGL_DISPMANX_WINDOW_T *eglWindow = new EGL_DISPMANX_WINDOW_T;


この時、QtGuiモジュール内のBRCMテストを修正することにより、コンパイルすることができる。

vi /<Qt 5のソースコードディレクトリ>/qtbase/src/gui/configure.json


 # /<Qt 5のソースコードディレクトリ>/qtbase/src/gui/configure.jsonファイル
 
 # 編集前
 "main": "vc_dispmanx_display_open(0);"
 
 # 編集後
 "main": [
    "vc_dispmanx_display_open(0);",
    "EGL_DISPMANX_WINDOW_T *eglWindow = new EGL_DISPMANX_WINDOW_T;"
 ]


No route to host : デバッグエラー

デバッグ実行開始前に、以下に示すようなエラーが表示される場合がある。

tcp:<IPアドレス または ホスト名>
No route to host 〜


これは、Raspberry Piのファイアーウォールが設定されているため、リモートデバッグ向けの指定のポートを開放する必要がある。
Qt Creatorを使用している場合、デフォルトのポート番号は10000-10100である。

Raspberry Piにアクセスして、ファイアーウォールの指定のポートを開放する。

sudo firewall-cmd --permanent --zone=public --add-port="10000-10100"/tcp
sudo firewall-cmd --reload


libEGL warning: DRI2: failed to authenticate - Raspberry 4Bのみ

以下のコマンドを実行する。

sudo raspi-config


次に、[Advanced Options] - [A8 GL Driver] - [G2 GL (Fake KMS)]を選択する。(KMSが有効になる)
最後に、[Finish]を選択して終了する。
(このオプションが利用可能になる前に、いくつかのアップデートを促される時はアップデートする)

GLX/DRI2 is not supported/failed to authenticate : Raspbian OS Buster以前

Qtプロジェクトをリモートデバッグする時、この警告が出力される場合がある。
この警告は、他のソフトウェアが独自のMesaライブラリ(libEGLとlibGLESv2)を追加しているために表示される。

まず、libEGLとlibGLESv2のパスを確認するため、以下のコマンドを実行する。
(おそらく、/opt/vc/lib/libEGL.soと/opt/vc/lib/libGLESv2.soが表示される)

sudo find / -iname "*egl*"
sudo find / -iname "*gles*"


上記で表示されたファイルのシンボリックファイルを、以下のディレクトリに作成する。

# Raspberry Pi 3B
sudo ln -sf /opt/vc/lib/libbrcmEGL.so    /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -sf /opt/vc/lib/libbrcmEGL.so    /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -sf /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2

# Raspberry Pi 4B
sudo ln -sf /opt/vc/lib/libEGL.so    /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -sf /opt/vc/lib/libEGL.so    /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -sf /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2


※注意
Debian等では、/usr/lib/x86_64-linux-gnu/mesa-eglディレクトリに存在する場合があるため、それに応じてコマンドを変更する必要がある。

最後に、ライブラリファイルを読み込むため、以下のコマンドを実行する。

sudo ldconfig


上記のシンボリックリンクの設定を元に戻す場合は、以下のように実行する。

# Raspberry Pi 3B
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0    /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1        /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2     /usr/lib/arm-linux-gnueabihf/libGLESv2.so

# Raspberry Pi 4B
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0    /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1        /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2     /usr/lib/arm-linux-gnueabihf/libGLESv2.so


Note: Disabling X11 Accessibility Bridge: D-Bus or AT-SPI is missing.

Qtのソースコードにおいて、Configureスクリプトを実行する時、この注意が表示される場合がある。
この時、Raspberry Piに対して、以下のライブラリをインストールする。

sudo apt-get install at-spi2-core gir1.2-atspi-2.0 libatspi2.0-dev



QtWebEngineのビルドおよびインストール

上記のセクションでは、QtWebEngineモジュールを無効にしている。
これは、QtWebEngineのビルドには多くの時間とディスクスペースが必要なためである。

勿論、QtWebEngineとQtを同時にビルドすることも可能であるが、ビルドに失敗する場合はビルド全体が失敗したことになるため、
まず、ベースとなるQt 5を個別にビルドした後、QtWebEngineを個別にビルドすることを推奨する。

依存関係のライブラリのインストール

必須およびオプションのライブラリ
ライブラリ名 備考
必須 flex bison gperf libre2-dev libnss3-dev
X11対応に必要 libdrm-dev libxdamage-dev XCB / X11を使用する場合、
これらのライブラリが必要である。
オプション libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev
libevent-dev libprotobuf-dev protobuf-compiler libwebp-dev libpoppler-cpp-dev
追加サポートとして便利である。
(オプション)
システム構築ツール
ninja-build re2c ninjaビルドツールを使用することで、
ビルドを高速化できることがある。
使用できないライブラリ libopus-dev libvpx-dev OpusとVPXメディアのサポートが追加されるが、
Raspbian busterで利用するには古すぎる。


QtWebEngineのダウンロード

Qtの公式Webサイトから、QtWebEngineをダウンロードする。
https://download.qt.io/official_releases/qt/x.x/x.x.x/submodules/qtwebengine-everywhere-src-x.x.x.tar.xz

QtWebEngineのビルド設定

ダウンロードしたQtWebEngineのビルド設定を編集する。

QtWebEngineでのジャンボビルドを無効化する。
標準のジャンボビルドシステムでは、コンパイル時に不明のエラーが出力されるため、無効にする。

sed -i -e 's|use_jumbo_build=true|use_jumbo_build=false|' /<QtWebEngineのソースコードがあるディレクトリ>/src/buildtools/config/common.pri


QtWebEngineのビルドとインストール

次に、QtWebEngineのConfigureスクリプトを実行する。

/opt/Qt/5.15.2/bin/qmake /<QtWebEngineのソースコードがあるディレクトリ> -- -no-webengine-geolocation


正常に終了する時、以下のようなサマリが表示される。

Qt WebEngine:
 Embedded build ......................... no
 Full debug information ................. no
 Pepper Plugins ......................... yes
 Printing and PDF ....................... yes
 Proprietary Codecs ..................... no
 Spellchecker ........................... yes
 Native Spellchecker .................... no
 WebRTC ................................. yes
 Use System Ninja ....................... yes
 Geolocation ............................ no
 WebChannel support ..................... yes
 Use v8 snapshot ........................ yes
 Kerberos Authentication ................ no
 Support qpa-xcb ........................ yes
 Use ALSA ............................... yes
 Use PulseAudio ......................... no
 Optional system libraries used:
   re2 .................................. yes
   icu .................................. no
   libwebp, libwebpmux and libwebpdemux . no
   opus ................................. no
   ffmpeg ............................... no
   libvpx ............................... no
   snappy ............................... no
   glib ................................. yes
   zlib ................................. yes
   minizip .............................. yes
   libevent ............................. yes
   jsoncpp .............................. yes
   protobuf ............................. yes
   libxml2 and libxslt .................. yes
   lcms2 ................................ yes
   png .................................. yes
   JPEG ................................. yes
   harfbuzz ............................. no
   freetype ............................. yes
 Required system libraries:
   fontconfig ........................... yes
   dbus ................................. yes
   nss .................................. yes
   khr .................................. yes
   glibc ................................ yes
 Required system libraries for qpa-xcb:
   x11 .................................. yes
   libdrm ............................... yes
   xcomposite ........................... yes
   xcursor .............................. yes
   xi ................................... yes
   xtst ................................. yes


最後に、QtWebEngineをビルドする。
もし、ビルドするPCのメモリが8[GB]以下の場合、NINJAJOBSを4以下にして、Ninjaの並列ビルドの量を制限する必要がある。

make -j $(nproc)
または
make -j 4 NINJAJOBS=-j4

make install


QtWebEngineのビルド時に発生する問題

下表は、QtWebEngineで見つかった問題とビルドの問題を集めたものである。

ビルド時の問題点と解決策
QtWebEngineのバージョン 問題 解決策
5.15.2 Internal Compiler Error, gcc 8.30

internal compiler error: in convert_move, at expr.c:218
static void exec_ops(const Op* ops, const void** args,
GCC Bugzilla bug report

Build for ARMv7
Patch the source to disable optimization
5.15.2 fatal error: xcb/dri3.h: No such file or directory 以下のライブラリをインストールする。
sudo apt-get install libxcb-dri3-dev
5.15.2 Broadcom EGLを使用するQtのビルドに失敗する。

qtwebengine-everywhere-src-x.x.x/src/3rdparty/chromium/ui/gl/gl_bindings_autogen_egl.h:201:5:
error: ‘EGLDeviceEXT’ has not been declared
Broadcom EGLの代わりに、
VC4 / KMSを使用してビルドする。