「インストール - Qt6」の版間の差分

366行目: 366行目:
<br><br>
<br><br>


== Raspberry Pi 3B / 4Bのクロスコンパイル ==
== Raspberry Piのクロスコンパイル ==
==== 概要 ====
Raspberry Piでクロスコンパイルを行う場合、[[インストール_-_Qt6_Raspberry_Pi]]のページを参照すること。<br>
Raspberry Piにおいて、一般的なデスクトップソフトウェアのクロスコンパイルおよび組み込み / デバイス作成のユースケースの<br>
クロスコンパイルを行う手順を記載する。<br>
<br>
組み込み / デバイス作成とは、デスクトップソフトウェアをX11の下で実行するためのものではなく、<br>
ソフトウェアがBroadcomドライバを使用して、dispmanx / EGLの上でフルスクリーンで実行するというユースケースのことである。<br>
<br>
<u>EGLを使用する場合、Qtソフトウェアはフルスクリーンでのみ動作する。</u><br>
<u>通常のウインドウで起動する場合は、XCBを使用する必要があるが、XCBはOpenGLやQt Quickは動作しないことに注意すること。</u><br>
<br>
<u>このセクションでは、Raspberry PiにRaspbian Busterをインストールしていることを想定している。</u><br>
<br>
==== Linux PCの設定 ====
Linux PCにおいて、以下の依存関係のライブラリをインストールする。<br>
(Texinfoは、GNU公式Webサイトにアクセスして、ソースコードからインストールすることを推奨する)<br>
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
<br>
Raspberry Pi専用のGCC ARMツールチェインをダウンロードする。<br>
https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/<br>
<center>
{| class="wikitable" style="background-color:#fefefe;"
|+ 表. GCC ARMツールチェーンのダウンロード
|-
! style="background-color:#66ccff;" | Raspberry Piの種類
! style="background-color:#66ccff;" | Raspbian Stretch(32-bit)
! style="background-color:#66ccff;" | Raspbian Buster(32-bit)
! style="background-color:#66ccff;" | Raspbian Bullseye(32-bit)
|-
| Raspberry Pi Zero/W/WH<br>Raspberry Pi 1 Model A / B / A+ / B+
| style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%206.3.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-6.3.0-pi_0-1.tar.gz/download 6.3]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%209.4.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-9.4.0-pi_0-1.tar.gz/download 9.4]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%2010.3.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-10.3.0-pi_0-1.tar.gz/download 10.3]
| style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%208.3.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-8.3.0-pi_0-1.tar.gz/download 8.3]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%209.3.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-9.3.0-pi_0-1.tar.gz/download 9.3]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%2010.2.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-10.2.0-pi_0-1.tar.gz/download 10.3]
| style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Bullseye/GCC%2010.3.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-10.3.0-pi_0-1.tar.gz/download 10.3]
|-
| Raspberry Pi 2 Model A / B<br>Raspberry Pi 3 Model A / B
| style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%206.3.0/Raspberry%20Pi%202%2C%203/cross-gcc-6.3.0-pi_2-3.tar.gz/download 6.3]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%209.4.0/Raspberry%20Pi%202%2C%203/cross-gcc-9.4.0-pi_2-3.tar.gz/download 9.4]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%2010.3.0/Raspberry%20Pi%202%2C%203/cross-gcc-10.3.0-pi_2-3.tar.gz/download 10.3]
| style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%208.3.0/Raspberry%20Pi%202%2C%203/cross-gcc-8.3.0-pi_2-3.tar.gz/download 8.3]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%209.4.0/Raspberry%20Pi%202%2C%203/cross-gcc-9.4.0-pi_2-3.tar.gz/download 9.4]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%2010.3.0/Raspberry%20Pi%202%2C%203/cross-gcc-10.3.0-pi_2-3.tar.gz/download 10.3]
| style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Bullseye/GCC%2010.3.0/Raspberry%20Pi%202%2C%203/cross-gcc-10.3.0-pi_2-3.tar.gz/download 10.3]
|-
| Raspberry Pi 3 Model A+ / B+<br>Raspberry Pi 4 Model A+ / B+<br>Raspberry Pi Compute 3 / 3lite / 3+
| style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%206.3.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-6.3.0-pi_3%2B.tar.gz/download 6.3]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%209.4.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-9.4.0-pi_3%2B.tar.gz/download 9.4]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%2010.2.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-10.3.0-pi_3%2B.tar.gz/download 10.3]
| style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%208.3.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-8.3.0-pi_3%2B.tar.gz/download 8.3]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%209.4.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-9.4.0-pi_3%2B.tar.gz/download 9.4]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%2010.3.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-10.3.0-pi_3%2B.tar.gz/download 10.3]
| style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Bullseye/GCC%2010.3.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-10.3.0-pi_3%2B.tar.gz/download 10.3]
|}
</center>
<br>
GCC ARMツールチェーンにおいて、GCC 8以降が必要なため、Linaro社のGCC ARMツールチェーンは使用できない。<br>
上表にあるGCC ARM 8.3.0ツールチェーンが動作しない場合、以下のURLにあるGCC ARM 8.3.0ツールチェーンを使用する。<br>
https://bugfreeblog.page.link/rasplinuxgcc830<br>
<br>
または、開発者がGCC ARMツールチェーンを作成する。<br>
詳細は、[[インストール - GCC#クロスコンパイラ向けGCCツールチェーンのインストール]]を参照すること。<br>
<br>
GCC ARMツールチェインを解凍して、任意のディレクトリに配置する。<br>
ここでは、~/InstallSoftware/GCC_ARMディレクトリに配置している。<br>
mv cross-gcc-10.2.0-pi_3+.tar.gz GCC_Raspbian_Buster32_10_2_0
cd GCC_Raspbian_Buster32_10_2_0 ~/InstallSoftware/GCC_ARM
<br>
GCC ARMツールチェーンは、システム固有のLTO(Link Time Optimization)フラグを使用して構築されているため、<br>
ソフトウェアをコンパイルする時、これらのツールチェーンを使用することで、Raspberry PiのSoC固有の機能を簡単に利用することができる。<br>
<br>
Raspberry Pi 4は、Broadcom BCM2711 SoC(Cortex-A72 64bit)を採用しており、Raspberry Pi 3B+と同様、ARMv8-aアーキテクチャを採用している。<br>
<br>
<center>
{| class="wikitable" style="background-color:#fefefe;"
|+ 表. Raspberry PiとLTO(Link Time Optimization)フラグの関係
|-
! style="background-color:#66ccff;" | Raspberry Piの種類
! style="background-color:#66ccff;" | LTO(Link Time Optimization)フラグ
|-
| Raspberry Pi Zero/W/WH<br>Raspberry Pi 1 Model A / B / A+ / B+ || -march=armv6 -mfloat-abi=hard -mfpu=vfp
|-
| Raspberry Pi 2 Model A / B<br>Raspberry Pi 3 Model A / B || -march=armv7-a -mfloat-abi=hard -mfpu=neon-vfpv4
|-
| Raspberry Pi 3 Model A+ / B+ (32Bit)<br>Raspberry Pi 4 Model A+ / B+ (32Bit)<br>Raspberry Pi Compute 3 / 3lite / 3+ (32Bit) || -march=armv8-a -mfloat-abi=hard -mfpu=neon-fp-armv8
|-
| Raspberry Pi 3 Model A+ / B+ (64Bit)<br>Raspberry Pi 4 Model A+ / B+ (64Bit)<br>Raspberry Pi Compute 3 / 3lite / 3+ (64Bit) || -march=armv8-a+fp+simd
|}
</center>
<br>
Qt 6を使用してクロスコンパイルする場合、x86 64向けのQtライブラリも必要となる。<br>
そのため、Qtオンラインインストーラからx86 64向けのQtライブラリをインストールする。<br>
<br>
<u>(Qt 6のソースコードからx86 64向けのQt 6ライブラリをビルドおよびインストールしてもよいが、煩雑なため推奨しない)</u><br>
<br>
wget http://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run
<br>
ダウンロードしたファイルに実行権限を付加する。<br>
chmod +x qt-unified-linux-x64-online.run
<br>
次に、GCCおよびmake等の開発に付随するライブラリをインストールする。<br>
# RHEL
sudo dnf groupinstall "Development tools"
# SUSE
sudo zypper install --type pattern devel_basis
<br>
Qtオンラインインストーラを実行する。<br>
./qt-unified-linux-x64-online.run
<br>
Qtのインストール画面に従って、Qt 6をインストールする。<br>
<br>
 
==== Raspberry Piの設定 ====
描画処理に時間が掛かる場合、Raspberry PiのVRAMを128[MB]や256[MB]程度に変更する。<br>
* VRAMを変更する手順
*: <code>sudo raspi-config</code>
*: 次に、[Performance Options] - [GPU Memory]を選択して、任意の数値を入力する。
*: 最後に、[Finish]を選択して終了する。
<br>
<u>Raspberry Pi 4Bでは、Broadcom EGLはサポートされていないため、Qt 5を使用する場合は、KMSを有効にする必要がある。</u><br>
また、KMSを有効にするには、<u>libgles2-mesa-dev</u>ライブラリと<u>libgbm-dev</u>ライブラリをインストールする必要がある。<br>
* GL(FAKE KMS)を有効にする手順
*: <code>sudo raspi-config</code>
*: 次に、[Advanced Options] - [A8 GL Driver] - [G2 GL (Fake KMS)]を選択することにより、KMSが有効になる。
*: 最後に、[Finish]を選択して終了する。
*: (最小限のビルドを使用する場合、このオプションが利用可能になる前に、いくつかのアップデートを促される時はアップデートする。
<br>
次に、/etc/apt/sources.listファイルのdeb-srcから始まる行のコメントを外す。<br>
sudo vi /etc/apt/sources.list
<br>
# /etc/apt/sources.listファイル
# 編集前
#deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
# 編集後
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
<br>
Raspbian Busterのソフトウェアをアップデートする。<br>
sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot
<br>
Raspberry Piのファームウェアをアップデートする。<br>
sudo rpi-update
sudo reboot
<br>
Raspberry Piに、Qtライブラリをインストールする。(ここでは簡単にするために、build-depを使用する)<br>
ここで、<code>build-dep</code>コマンドとは、ビルドに必要なパッケージが全てインストールするコマンドである。<br>
ビルド設定によっては、不要なパッケージも含まれている。<br>
# Raspberry Pi 3B
# EGLを使用する場合
sudo apt-get install ccache flex bison gperf ruby libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-dev \
                      libatkmm-1.6-dev libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                      libboost1.71-all-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 \
                      mesa-common-dev libegl1-mesa-dev libgles2-mesa-dev libgbm-dev \
                      python (QtQuickを使用する場合) \
                      libgtk-3-dev (QtWidget向けにGTKネイティブテーマを使用する場合)
# XCBを使用する場合
sudo apt-get install ccache flex bison gperf ruby libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-dev \
                      libatkmm-1.6-dev libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                      libboost1.71-all-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 at-spi2-core gir1.2-atspi-2.0 libatspi2.0-dev \
                      python (QtQuickを使用する場合) \
                      libgtk-3-dev (QtWidget向けにGTKネイティブテーマを使用する場合)
# Raspberry Pi 4B
# EGLを使用する場合
sudo apt-get install ccache flex bison gperf ruby libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-dev \
                      libatkmm-1.6-dev libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                      libboost1.71-all-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 libgbm-dev \
                      libxcb-xinerama0 libxcb-xinerama0-dev gdbserver
                      python (QtQuickを使用する場合) \
                      libgtk-3-dev (QtWidget向けにGTKネイティブテーマを使用する場合)
# XCBを使用する場合
sudo apt-get install ccache flex bison gperf ruby libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-dev \
                      libatkmm-1.6-dev libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                      libboost1.71-all-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 libgbm-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 \
                      python        (QtQuickを使用する場合) \
                      libgtk-3-dev  (QtWidget向けにGTKネイティブテーマを使用する場合)
sudo apt-get build-dep libqt5webengine-data (WebEngineを使用する場合)
sudo apt-get build-dep libqt5webkit5        (WebKitを使用する場合)
<br>
マルチメディア関連やBluetooth等を使用する場合、下表に示す任意のパッケージをインストールする。<br>
<center>
{| class="wikitable" style="background-color:#fefefe;"
|+ その他のライブラリ(オプション)
|-
! style="background-color:#00ffff;" | 機能
! style="background-color:#00ffff;" | インストールするライブラリ
! style="background-color:#00ffff;" | configureスクリプトのオプション
|-
| Bluetooth || bluez bluez-tools libbluetooth-dev ||
|-
| 画像 || libjpeg-dev libpng-dev libtiff-dev ||
|-
| コーデック || libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev ||
|-
| マルチメディア || gstreamer1.0-omx libgstreamer1.0-0 libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base<br>gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad<br>libgstreamer-plugins-bad1.0-dev gstreamer1.0-libav gstreamer1.0-pulseaudio gstreamer1.0-tools<br>gstreamer1.0-alsa gstreamer1.0-x gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5<br>libwayland-dev(Wayland開発パッケージは、gstreamerヘッダで必要) ||
|-
| ALSAオーディオ || libasound2-dev ||
|-
| Pulseオーディオ || pulseaudio libpulse-dev ||
|-
| OpenALオーディオ || libopenal-data libsndio7.0 libopenal1 libopenal-dev ||
|-
| データベース || libpq-dev(PostgreSQL)<br>libmariadbclient-dev(MariaDB / MySQL) ||
|-
| プリンタ || libcups2-dev ||
|-
| Wayland || libwayland-dev ||
|-
| X11 || libx11-dev libxcb1-dev  libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev<br>libfreetype6-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev<br>libxcb-glx0-dev  libxcb-keysyms1-dev libxcb-image0-dev  libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev<br>libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev  libxcb-util0-dev<br> libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libfontconfig1-dev ||
|-
| WebEngine || 必須 :<br>flex bison gperf libre2-dev libnss3-dev libdrm-dev<br><br>オプション1 :<br>libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev libevent-dev libprotobuf-dev<br>protobuf-compiler<br><br>オプション2(不安定なため注意すること) :<br>libopus-dev libvpx-dev ||
|-
| アクセシビリティ || libatspi-dev ||
|-
| SCTP || libsctp1 libsctp-dev || -sctp
|-
| Broadcom EGLの代わりに<br>VC4ドライバを使用する場合<br><br><u>※Raspberry Pi 4では必須</u> || libgles2-mesa-dev libgbm-dev || -platform linux-rpi-vc4-g++
|}
</center>
<br>
ビルドしたQtソフトウェアをRasberry Piにデプロイするためのディレクトリを作成する。<br>
加えて、Qtライブラリを配置するディレクトリも作成する。<br>
mkdir -p ~/InstallSoftware/QtApplication ~/InstallSoftware/Qt_5_x_x_EGL ~/InstallSoftware/Qt_5_x_x_XCB
<br>
<u>Raspberry Pi 4Bの場合、以下のシンボリックリンクを作成する。</u><br>
sudo ln -sf -r /usr/include/arm-linux-gnueabihf/asm /usr/include
sudo ln -sf -r /usr/include/arm-linux-gnueabihf/gnu /usr/include
sudo ln -sf -r /usr/include/arm-linux-gnueabihf/bits /usr/include
sudo ln -sf -r /usr/include/arm-linux-gnueabihf/sys/* /usr/include/sys
sudo ln -sf -r /usr/include/arm-linux-gnueabihf/openssl/* /usr/include/openssl
sudo ln -sf /usr/lib/arm-linux-gnueabihf/crtn.o /usr/lib/crtn.o && \
sudo ln -sf /usr/lib/arm-linux-gnueabihf/crt1.o /usr/lib/crt1.o && \
sudo ln -sf /usr/lib/arm-linux-gnueabihf/crti.o /usr/lib/crti.o
<br>
次のセクションにおいて、<code>rsync</code>コマンドを使用してLinux PCとRaspberry Piのファイルを同期する。<br>
<u>しかし、同期するファイルには、スーパユーザ権限が必要なものがある。</u><br>
<br>
そのため、一般ユーザでも全てのファイルを同期できるように、/etc/sudoersファイルに以下の設定を追記する。<br>
以下の設定により、<code>rsync</code>コマンドは、必要に応じてスーパユーザ権限で実行される。<br>
echo "$USER ALL=NOPASSWD:$(which rsync)" | sudo tee --append /etc/sudoers
<br>
 
==== システムルートディレクトリの設定 ====
Linux PCで、Raspberry Pi向けのQtソフトウェアをクロスコンパイルできるように開発環境を設定する。<br>
Raspberry Pi上でネイティブにコンパイルすることもできるが、Linux PCの方がスループットが良い。<br>
<br>
Linux PC上に開発用ディレクトリを作成する。<br>
また、Raspberry Piのいくつかのルートディレクトリと同期する必要があるため、システムルートディレクトリも作成する。<br>
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
<br>
<code>rsync</code>コマンドを使用して、Raspberry Piに存在するいくつかのディレクトリから、ファイルをダウンロードする。<br>
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
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/opt/vc ~/Program/Qt_Embedded/sysroot/opt
<br>
ダウンロードしたファイルおよびディレクトリのシンボリックリンクを相対的に調整する。<br>
fixQualifiedLibraryPathsが正常に動作しないため、提供されたスクリプトをダウンロードして実行する。<br>
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
<br>
 
==== Qtライブラリのダウンロード ====
===== Raspberry Pi 3B /4B 共通 =====
まず、Qtライブラリのソースコードをダウンロードする。<br>
<br>
以下のコマンドにおいて、<Qtのバージョン>および<Qtのショートバージョン>は、ダウンロードするQtのバージョンに変更する。<br>
例えば、Qt 5.15.2をダウンロードする場合、5.15.2と入力する。Qt 5.15の最新版をダウンロードする場合、5.15と入力する。<br>
* QtBaseをダウンロードする場合
*: <code>cd ~/Program/Qt_Embedded</code>
*: <code>git clone git://code.qt.io/qt/qtbase.git -b <Qtのバージョン></code>
*: または
*: <code>git clone https://github.com/qt/qtbase -b <Qtのバージョン></code>
*: <br>
* Qt Everywhere Opensourceをビルドする場合
*: <code>wget https://download.qt.io/official_releases/qt/x.x/x.x.x/single/qt-everywhere-src-x.x.x.tar.xz</code>
*: <code>tar xf qt-everywhere-opensource-src-x.x.x.tar.gz</code>
*: <code>cd qt-everywhere-opensource-src-x.x.x</code>
*: <br>
* Githubからソースコードをダウンロードする場合
*: QtのGithubでは、より多くの新しいアップデートが行われている。
*: <code>git clone https://github.com/qt/qt5.git</code>
*: <code>cd qt5</code>
*: <code>git checkout <Qtのバージョン></code>または<code>git checkout <Qtのショートバージョン></code>
*: <br>
*: <code>init-repository</code>コマンドは、Qtが提供する指定したモジュールのソースコードを取得するためのツールである。
*: super-repoはそれ自体は小さく、他の全てはgit submodulesとして保持されている。
*: 利用可能な全てのモジュールについては[https://doc.qt.io/qt-5/qtmodules.html こちらのWebサイト]、ツールについては<code>init-repository --help</code>コマンドまたは[https://github.com/qt/qt5/blob/dev/init-repository こちらのWebサイト]を参照すること。
*: <code>./init-repository --module-subset=essential</code>
*: <br>
<br>
 
===== Raspberry Pi 4B =====
<u>Raspberry Pi 4Bの場合、以下のように、qmake.confをカスタマイズする必要がある。</u><br>
qmake.confファイルは、ビルド時の設定を定義するものである。<br>
cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs
cp -r linux-arm-gnueabi-g++ linux-arm-gnueabihf-g++
sed -i -e 's/arm-linux-gnueabi-/arm-linux-gnueabihf-/g' ./linux-arm-gnueabihf-g++/qmake.conf
<br>
 
===== Raspberry Pi 3B (XCBを使用する場合) =====
<u>設定不要だと推測される。</u><br>
<br>
以下のように、qmake.confをカスタマイズする必要がある。<br>
cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
cp -r linux-rasp-pi3-vc4-g++ linux-rasp-pi3-vc4-brcm-g++
vi linux-rasp-pi3-vc4-brcm-g++/qmake.conf
<br>
# linux-rasp-pi3-vc4-brcm-g++/qmake.confファイル
# 編集前
QMAKE_LIBS_EGL        += -lEGL
QMAKE_LIBS_OPENGL_ES2  += -lGLESv2 -lEGL
# 編集後
QMAKE_LIBS_EGL          += -lbrcmEGL -lbrcmGLESv2
QMAKE_LIBS_OPENGL_ES2  += -lbrcmGLESv2 -lbrcmEGL
<br>
===== Raspberry Pi 3B (EGLを使用する場合)=====
* 方法 1
Raspberry Pi 3Bの場合も、以下のように、qmake.confをカスタマイズする必要がある。<br>
cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
cp -r linux-rasp-pi3-g++ linux-rasp-pi3-brcm-g++
vi linux-rasp-pi3-brcm-g++/qmake.conf
<br>
# qmake.confファイル
# qmake configuration for the Raspberry Pi 3 using the Broadcom graphics stack
# MODIFIED to use the library names that are shipped since 2016
#
# Also setting the linker flags according to the pkg-config files that are shipped with the libraries.
# Remove egl.pc and glesv2.pc from /usr/lib/arm-linux-gnueabihf/pkgconfig/ for these to take effect.
# The reason for using static values instead of supplying the correct pkg-config files is that configure ignores -pthread from there
#
# Including headers from /opt/vc first, but also from mesa version of EGL and GLES, since the /opt/vc headers are from 2009 and don't work with qtwebengine.
# This way you can make mesa headers available by manually removing directories EGL, GLES and GLES2 from /opt/vc/include before building.
include(../common/linux_device_pre.conf)
# Let the linker know about /opt/vc/lib. Required for EGL config.test (at least) because brcmGLESv2 also needs brcmEGL.
QMAKE_RPATHLINKDIR_POST  += $$[QT_SYSROOT]/opt/vc/lib
VC_LIBRARY_PATH          =  $$[QT_SYSROOT]/opt/vc/lib
VC_INCLUDE_PATH          =  $$[QT_SYSROOT]/opt/vc/include
MESA_INCLUDE_PATH        =  $$[QT_SYSROOT]/usr/include
QMAKE_LIBDIR_OPENGL_ES2  =  $${VC_LIBRARY_PATH}
QMAKE_LIBDIR_EGL          =  $$QMAKE_LIBDIR_OPENGL_ES2
QMAKE_LIBDIR_OPENVG      =  $$QMAKE_LIBDIR_OPENGL_ES2
QMAKE_LIBDIR_BCM_HOST    =  $$VC_LIBRARY_PATH
QMAKE_INCDIR_EGL          = \
                            $${VC_INCLUDE_PATH} \
                            $${MESA_INCLUDE_PATH} \
                            $${VC_INCLUDE_PATH}/interface/vcos/pthreads \
                            $${VC_INCLUDE_PATH}/interface/vmcs_host/linux
QMAKE_INCDIR_OPENGL_ES2  = $${QMAKE_INCDIR_EGL}
QMAKE_INCDIR_BCM_HOST    = $$VC_INCLUDE_PATH
# recreating pkg-config --libs glesv2
QMAKE_LIBS_OPENGL_ES2    = -L$${VC_LIBRARY_PATH} -lbrcmGLESv2 -lbcm_host -lvcos -lvchiq_arm -pthread
# recreating pkg-config --libs egl
QMAKE_LIBS_EGL            = -L$${VC_LIBRARY_PATH} -lbrcmEGL -lbrcmGLESv2 -lbcm_host -lvchostif -lbcm_host -lvcos -lvchiq_arm -pthread
#recreating pkg-config --libs bcm_host
QMAKE_LIBS_BCM_HOST      = -L$${VC_LIBRARY_PATH} -lbcm_host -lvcos -lvchiq_arm -pthread
QMAKE_CFLAGS              = -march=armv8-a -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8
QMAKE_CXXFLAGS            = $$QMAKE_CFLAGS
DISTRO_OPTS              += hard-float
DISTRO_OPTS              += deb-multi-arch
EGLFS_DEVICE_INTEGRATION  = eglfs_brcm
include(../common/linux_arm_device_post.conf)
load(qt_config)
<br>
<u>Raspberry Pi 3Bの場合、上記で作成したqmake.confファイルを使用する必要がある。</u><br>
これは、Qtをビルドする時、pkg-configを使用して、どのライブラリがどの場所にインストールされているかを判断する。<br>
<br>
実際には複数の方法があるが、最良の方法は、上記で作成したqmake.confファイルの静的な定義を使用することである。<br>
そこで、.pcファイルを削除して、configureがMesaのデフォルトを使用せずに、上記の定義を使用する。<br>
cd /<sysrootが存在するディレクトリ>/sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig
mv egl.pc egl.pc.mesa
mv glesv2.pc glesv2.pc.mesa
<br>
* 方法 2
cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
cp -r linux-rasp-pi2-g++ linux-rasp-pi3-brcm-g++
vi linux-rasp-pi3-brcm-g++/qmake.conf
<br>
# linux-rasp-pi3-ex-g++/qmake.confファイル
# 編集前
QMAKE_LIBS_EGL    = -lEGL -lGLESv2
QMAKE_LIBS_OPENVG = -lEGL -lOpenVG -lGLESv2
# 編集後
QMAKE_LIBS_EGL        = -lbrcmEGL -lbrcmGLESv2
QMAKE_LIBS_OPENGL_ES2 = -lbrcmEGL -lbrcmGLESv2  # 追記
QMAKE_LIBS_OPENVG    = -lbrcmEGL -lbrcmOpenVG -lbrcmGLESv2
<br>
次に、以下のソースコードを編集する。<br>
vi /<Qtのソースコードが存在するディレクトリ>/qtbase/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglwindow.cpp
<br>
# qxcbeglwindow.cppファイル  96行目あたり
# 編集前
m_surface = eglCreateWindowSurface(m_glIntegration->eglDisplay(), m_config, m_window, 0);
# 編集後
m_surface = eglCreateWindowSurface(m_glIntegration->eglDisplay(), m_config, (void*)m_window, 0);
<br>
SysRootディレクトリから、nss.pcファイルがあるディレクトリに対して、パスを追加する。<br>
find <SysRootディレクトリ> -type f -name nss.pc
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$(pkg-config --variable pc_path pkg-config)"
export PKG_CONFIG_PATH="<nss.pcファイルが存在するディレクトリ>:$PKG_CONFIG_PATH"
<br>
* 方法 3
cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
cp -r linux-rasp-pi3-g++ linux-rasp-pi3-brcm-g++
vi linux-rasp-pi3-brcm-g++/qmake.conf
<br>
include(../common/linux_device_pre.conf)
QMAKE_LFLAGS          += -Wl,-rpath-link,$$[QT_SYSROOT]/opt/vc/lib
QMAKE_LFLAGS          += -Wl,-rpath-link,$$[QT_SYSROOT]/home/pi/<Qtライブラリをデプロイするディレクトリ>/lib
QMAKE_LIBDIR_OPENGL_ES2 = $$[QT_SYSROOT]/opt/vc/lib
QMAKE_LIBDIR_EGL        = $$QMAKE_LIBDIR_OPENGL_ES2
QMAKE_LIBDIR_OPENVG    = $$QMAKE_LIBDIR_OPENGL_ES2
QMAKE_INCDIR_EGL        = $$[QT_SYSROOT]/opt/vc/include \
                          $$[QT_SYSROOT]/opt/vc/include/interface/vcos/pthreads \
                          $$[QT_SYSROOT]/opt/vc/include/interface/vmcs_host/linux
QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}
QMAKE_INCDIR_OPENVG    = $${QMAKE_INCDIR_EGL}
QMAKE_LIBS_EGL          = -lEGL -lGLESv2
QMAKE_LIBS_OPENVG      = -lEGL -lOpenVG -lGLESv2
QMAKE_CFLAGS            = -march=armv8-a -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8
QMAKE_CXXFLAGS          = $$QMAKE_CFLAGS
DISTRO_OPTS            += hard-float
DISTRO_OPTS            += deb-multi-arch
# Preferred eglfs backend
EGLFS_DEVICE_INTEGRATION= eglfs_brcm
include(../common/linux_arm_device_post.conf)
load(qt_config)
<br>
* 方法 4
<u>この方法は、qt-everywhere-src-5.x.xファイルのみで実行できる。</u><br>
<br>
Githubから、mkspecsを自動編集するツールをダウンロードする。<br>
このツールでは、libbrcm*.soライブラリ名を参照するように設定されている。<br>
git clone https://github.com/oniongarlic/qt-raspberrypi-configuration.git
<br>
ツールをQtのソースコードがあるディレクトリにインストールする。<br>
cd ./qt-raspberrypi-configuration
make install DESTDIR=<Qtのソースコードがあるディレクトリ>/qt-everywhere-src-5.x.x
<br>
 
==== Qtライブラリのビルド ====
ここでは、Qtソフトウェアは~/Program/Qt_Embedded/QtSoftwareディレクトリ、qmake等のホストツールは~/Program/Qt_Embedded/Hostディレクトリ、<br>
Qtライブラリは~/Program/Qt_Embedded/Target_EGLディレクトリまたは~/Program/Qt_Embedded/Target_XCBディレクトリとしている。<br>
<br>
<Raspberry Piのバージョン>は、Raspberry Piの種類に変更する。<br>
<u>ただし、上記のセクションでmkspecを変更した場合は、そのディレクトリ名に合わせること。</u><br>
* <Raspberry Piのバージョン>
** Raspberry Pi 1
**: <code>linux-rasp-pi-g++</code>
** Raspberry Pi 2
**: <code>linux-rasp-pi2-g++</code>
** Reaspberry Pi 3
*** <code>linux-rasp-pi3-g++</code>(EGL)
*** <code>linux-rasp-pi3-vc4-g++</code>(XCB)
*** 上記のセクションで作成した<code>linux-rasp-pi3-brcm-g++</code>(EGL)
*** その他
** Raspberry Pi 4
**: <code>linux-rasp-pi4-v3d-g++</code>
<br>
<u>Raspbian OS 64bitを使用している場合は、<code>-device-option</code>オプションを以下のように記述する。</u><br>
<code>-device-option CROSS_COMPILE=/<GCC ARMツールチェインのインストールディレクトリ>/bin/aarch64-linux-gnueabihf-</code><br>
また、Qt 5.8以降は、<code>-no-use-gold-linker</code>オプションを追加する必要がある。<br>
<br>
* QtBase / Qt Everywhere Opensource / GithubからダウンロードしたQt
*: ビルドディレクトリの作成
*: <code>mkdir /<Qtのソースコードがあるディレクトリ>/../build && cd /<Qtのソースコードがあるディレクトリ>/../build</code>
*: <br>
*: <u>GCC ARM 8.3.0以降を使用する場合は、以下の設定をターミナルで実行する。</u>
*: <code>CROSS_PI_PATH=/<GCC ARMツールチェインのインストールディレクトリ></code>
*: <code>CROSS_COMPILE=$CROSS_PI_PATH/bin/arm-linux-gnueabihf-</code>
*: <br>
*: <code>LD_LIBRARY_PATH=$CROSS_PI_PATH/lib:$LD_LIBRARY_PATH</code>
*: <code>LD_LIBRARY_PATH=$CROSS_PI_PATH/arm-linux-gnueabihf/lib:$LD_LIBRARY_PATH</code>
*: <code>LD_LIBRARY_PATH=$CROSS_PI_PATH/arm-linux-gnueabihf/libc/usr/lib:$LD_LIBRARY_PATH</code>
*: <code>LD_LIBRARY_PATH=$CROSS_PI_PATH/arm-linux-gnueabihf/libc/lib:$LD_LIBRARY_PATH</code>
*: <br>
*: <code>LDFLAGS="-L$CROSS_PI_PATH/lib/ -L$CROSS_PI_PATH/arm-linux-gnueabihf/lib/ -L$CROSS_PI_PATH/arm-linux-gnueabihf/libc/usr/lib/ -L$CROSS_PI_PATH/arm-linux-gnueabihf/libc/lib/"</code>
*: <br>
*: Configureスクリプトの実行
*: <u># Raspberry Pi 3B</u>
*: <code>PKG_CONFIG_PATH="/<SysRootがあるディレクトリ>/usr/lib/pkgconfig:/<SysRootがあるディレクトリ>/usr/lib/arm-linux-gnueabihf/pkgconfig" \</code>
*: <code>PKG_CONFIG_LIBDIR=/<SysRootがあるディレクトリ>/usr/lib/arm-linux-gnueabihf/pkgconfig:/<SysRootがあるディレクトリ>/usr/share/pkgconfig \</code>
*: <code>../<Qtのソースコードがあるディレクトリ>/qt-everywhere-src-<Qtのバージョン>/configure -release \</code>
*: <code>-opengl es2 -eglfs \</code>           <span style="color:#C00000"><u>EGLを使用する場合</u></span>
*: <code>-opengl es2 \</code>                <span style="color:#C00000"><u>XCBを使用する場合</u></span>
*: <code>-device <Raspberry Piのバージョン> \</code>
*: <code>-device-option CROSS_COMPILE=/<GCC ARMツールチェーンのインストールディレクトリ>/bin/arm-linux-gnueabihf- \</code>
*: <code>-opensource -confirm-license -v \</code>
*: <code>-nomake examples -no-compile-examples -nomake tests -make libs -no-use-gold-linker -recheck-all -pkg-config \</code>
*: <code>-ltcg -iconv \</code>        # 必要な場合は指定する
*: <code>-qpa eglfs \</code>               <span style="color:#C00000"><u>EGLを使用する場合</u></span>
*: <code>-qpa xcb \</code>                <span style="color:#C00000"><u>XCBを使用する場合</u></span>
*: <code>-skip qtscript -skip qtwayland -skip qtwebengine -skip qtandroidextras -skip qtmacextras -skip qtwinextras \</code>
*: <code>-sysroot /<SysRootがあるディレクトリ>/sysroot \</code>
*: <code>-prefix /<Qtソフトウェアを配置するディレクトリ>/QtSoftware \</code>
*: <code>-extprefix /<Raspberry PiにインストールするQtライブラリを配置するディレクトリ>/Target \</code>
*: <code>-hostprefix /<Linux PCで使用するQtライブラリを配置するディレクトリ>/Host</code>
*: <code>-no-gcc-sysroot</code>             <span style="color:#C00000"><u>GCC ARM 8.3.0以降を使用する場合</u></span>
*: <br>
*: <u># Raspberry Pi 4B</u>
*: <code>PKG_CONFIG_PATH="/<SysRootがあるディレクトリ>/usr/lib/pkgconfig:/<SysRootがあるディレクトリ>/usr/lib/arm-linux-gnueabihf/pkgconfig" \</code>
*: <code>PKG_CONFIG_LIBDIR=/<SysRootがあるディレクトリ>/usr/lib/arm-linux-gnueabihf/pkgconfig:/<SysRootがあるディレクトリ>/usr/share/pkgconfig \</code>
*: <code>../<Qtのソースコードがあるディレクトリ>/qt-everywhere-src-<Qtのバージョン>/configure -release \</code>
*: <code>-opengl es2 -eglfs \</code>           <span style="color:#C00000"><u>EGLを使用する場合</u></span>
*: <code>-opengl es2 \</code>               <span style="color:#C00000"><u>XCBを使用する場合</u></span>
*: <code>-device <Raspberry Piのバージョン> \</code>
*: <code>-device-option CROSS_COMPILE=/<GCC ARMツールチェーンのインストールディレクトリ>/bin/arm-linux-gnueabihf- \</code>
*: <code>-opensource -confirm-license -v \</code>
*: <code>-nomake examples -no-compile-examples -nomake tests -make libs -no-use-gold-linker -recheck-all -pkg-config \</code>
*: <code>-ltcg -iconv -fontconfig -ccache \</code>        # 必要な場合は指定する
*: <code>-qpa eglfs \</code>               <span style="color:#C00000"><u>EGLを使用する場合</u></span>
*: <code>-qpa xcb \</code>                <span style="color:#C00000"><u>XCBを使用する場合</u></span>
*: <code>-skip qtscript -skip qtwayland -skip qtwebengine -skip qtandroidextras -skip qtmacextras -skip qtwinextras \</code>
*: <code>-sysroot /<SysRootがあるディレクトリ>/sysroot \</code>
*: <code>-prefix /<Qtソフトウェアを配置するディレクトリ>/QtSoftware \</code>
*: <code>-extprefix /<Raspberry PiにインストールするQtライブラリを配置するディレクトリ>/Target \</code>
*: <code>-hostprefix /<Linux PCで使用するQtライブラリを配置するディレクトリ>/Host</code>
*: <code>-no-gcc-sysroot</code>             <span style="color:#C00000"><u>GCC ARM 8.3.0以降を使用する場合</u></span>
*: <code>-I/<SysRootがあるディレクトリ>/sysroot/usr/include/arm-linux-gnueabihf \</code> # GCC ARM 8.3.0以降を使用する場合に必要(不要の可能性があるため要調査)
*: <code>-L/<SysRootがあるディレクトリ>/sysroot/usr/lib/arm-linux-gnueabihf \</code>   # GCC ARM 8.3.0以降を使用する場合に必要(不要の可能性があるため要調査)
*: <br>
*: ビルドおよびインストール
*: <code>gmake -j $(nproc)</code>
*: <code>gmake install</code>
*: <br>
*: <u>もし、Linux PCで使用するQtライブラリを配置するディレクトリにrccファイルが存在しない場合は、rccファイルをQtライブラリのbinディレクトリにコピーする。</u><br>
*: (Qtライブラリを使用するソフトウェアをビルドする時、rccファイルが必要である)<br>
*: <code>cp /<Qtのソースコードがあるディレクトリ>/qtbase/bin/rcc /<Linux PCで使用するQtライブラリを配置するディレクトリ>/bin</code>
<br>
必要ならば、以下のようなシェルスクリプトを作成すると便利である。<br>
<syntaxhighlight lang="bash">
#!/usr/bin/env sh
CROSS_PI_PATH=/<GCC ARM 8.3.0以降のインストールディレクトリ>
CROSS_COMPILE=$CROSS_PI_PATH/bin/arm-linux-gnueabihf-
LD_LIBRARY_PATH=$CROSS_PI_PATH/lib:$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CROSS_PI_PATH/arm-linux-gnueabihf/lib:$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CROSS_PI_PATH/arm-linux-gnueabihf/libc/usr/lib:$LD_LIBRARY_PATH
LD_LIBRARY_PATH=$CROSS_PI_PATH/arm-linux-gnueabihf/libc/lib:$LD_LIBRARY_PATH
LDFLAGS="-L$CROSS_PI_PATH/lib/ -L$CROSS_PI_PATH/arm-linux-gnueabihf/lib/ -L$CROSS_PI_PATH/arm-linux-gnueabihf/libc/usr/lib/ -L$CROSS_PI_PATH/arm-linux-gnueabihf/libc/lib/"
PKG_CONFIG_PATH="/<SysRootがあるディレクトリ>/usr/lib/pkgconfig:/<SysRootがあるディレクトリ>/usr/lib/arm-linux-gnueabihf/pkgconfig" \
PKG_CONFIG_LIBDIR=/<SysRootがあるディレクトリ>/sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig:/<SysRootがあるディレクトリ>/sysroot/usr/share/pkgconfig \
../Qt5_Src/configure -release \
-opengl es2 -eglfs \                    # EGLを使用する場合
-opengl es2 \                          # XCBを使用する場合
-device <Raspberry Piのバージョン> -device-option CROSS_COMPILE=${CROSS_COMPILE} \
-sysroot /<SysRootがあるディレクトリ>/sysroot \
-opensource -confirm-license -v \
-nomake examples -no-compile-examples -nomake tests -make libs -no-use-gold-linker -recheck-all \
-ccache -ltcg -iconv -sctp -freetype \  # 必要な場合は指定する
-skip qtscript -skip qtwayland -skip qtwebengine -skip qtandroidextras -skip qtmacextras -skip qtwinextras \
-qpa eglfs \                            # EGLを使用する場合
-qpa xcb \                              # XCBを使用する場合
-prefix /<Qtソフトウェアを配置するディレクトリ>/QtSoftware \
-extprefix /<Raspberry PiにインストールするQtライブラリを配置するディレクトリ>/Target \
-hostprefix /<Linux PCで使用するQtライブラリを配置するディレクトリ>/Host \
-no-gcc-sysroot                        # GCC ARM 8.3.0以降を使用する場合
</syntaxhighlight>
<br>
 
==== Qtライブラリのインストール ====
ビルドしたQtライブラリを、Raspberry Piにデプロイする。<br>
~/Program/Qt_Embedded/Qt5ディレクトリに存在する全てのファイルを、Raspberry Piの/usr/localディレクトリに同期させる。<br>
rsync -avz --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" \
~/Program/Qt_Embedded/Target <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/home/<Raspberry Piのユーザ名>/InstallSoftware/Qt_5_x_x
<br>
<u>※注意</u><br>
<u>Raspberry PiにアップロードしたQtライブラリの所有者がrootになっている場合があるため、</u><br>
<u>以下のコマンドを実行して、所有者をローカルユーザに変更する必要がある。</u><br>
sudo chown -R <Raspberry Piのユーザ名>:<Raspberry Piのグループ名> ~/InstallSoftware/Qt_5_x_x
<br>
Raspberry PiのリンカがQtライブラリを読み込むようにするため、以下のコマンドを実行する。<br>
<u>/etc/ld.so.conf.dディレクトリに配置する場合、Raspberry Pi 2B / 3Bでは、ファイル名の先頭に"00"を付加すること。</u><br>
# .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
<br>
これにより、Raspberry PiでQtライブラリが使用できる。<br>
<br>
 
==== Qtソフトウェアの動作確認 ====
Qtソフトウェアをビルドして、動作確認を行う。<br>
<br>
===== XCBを使用する場合 =====
Raspberry PiのEGL / GLESライブラリを修正する。<br>
<br>
Raspberry Piの/usr/lib/arm-linux-gnueabihfディレクトリには、MesaのlibEGLとlibGLESv2が存在する。<br>
XCBを使用したQtソフトウェアは、/opt/vc/libディレクトリにあるlibbrcmEGLとlibbrcmGLESv2ではなく、libEGLとlibGLESv2が自動的に選択される。<br>
<u>しかし、MesaのlibEGLとlibGLESv2は、OpenGLの描画処理と関わりがあるEGLでは、ほとんど役に立たない。(XCBは、OpenGLの描画処理とほぼ関係無い)</u><br>
<br>
そのため、libbrcmEGLとlibbrcmGLESv2を、libEGLとlibGLESv2に入れ替える。<br>
具体的には、libbrcmEGLとlibbrcmGLESv2のシンボリックリンクを/usr/lib/arm-linux-gnueabihfディレクトリに作成する。<br>
(必ず、元のファイルはバックアップすること)<br>
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
<br>
上記で設定したライブラリを読み込むため、以下のコマンドを実行する。<br>
sudo ldconfig
<br>
上記のシンボリックリンクの設定を元に戻す場合は、以下のように実行する。<br>
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
<br>
次に、Qt Creatorでソフトウェアを開発する時の環境設定を行う。<br>
Qt Creatorを起動して、Qt Creatorメイン画面左の[プロジェクト] - 左ペインの[Run] - 右ペインの[ビルド設定] - [Environment]項目 - [詳細]プルダウンを開く。<br>
[詳細]プルダウンから[追加]ボタンを押下して、以下の項目を設定する。<br>
* 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
<br>
さらに、Raspberry Piの~/.profileファイルまたは~/.bashrcファイルに、以下の設定を追記する。<br>
export QT_QPA_PLATFOMRTHEME=qt5ct
export DISPLAY=:0 または export DISPLAY=:0.0
export XAUTHORITY=/home/<Raspberry Piのユーザ名>/.Xauthrity
export XDG_SESSION_TYPE=x11
<br>
 
===== EGL / XCB 共通 =====
Qtソフトウェアのサンプルをダウンロードする。<br>
この時、<Qtソフトウェアのサンプル>と<Qtのバージョン>は合致するものを指定すること。<br>
git clone git://code.qt.io/qt/<Qtソフトウェアのサンプル>.git -b <Qtのバージョン>
cd <Qtソフトウェアのサンプル>
~/Program/Qt_Embedded/Qt5/bin/qmake
make -j $(nproc)
make install DESTDIR=<Qtソフトウェアを配置するディレクトリ>
<br>
最後に、QtソフトウェアをRaspberry Piにデプロイする。<br>
rsync -avz --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" /<Qtソフトウェアを配置するディレクトリ> \
<Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/home/<Raspberry Piのユーザ名>/<Qtソフトウェアをインストールするディレクトリ>
<br>
 
==== エラー関連 ====
===== libEGL warning: DRI2: failed to authenticate =====
以下のコマンドを実行する。<br>
sudo raspi-config
<br>
次に、[Advanced Options] - [A8 GL Driver] - [G2 GL (Fake KMS)]を選択する。(KMSが有効になる)<br>
最後に、[Finish]を選択して終了する。<br>
(このオプションが利用可能になる前に、いくつかのアップデートを促される時はアップデートする)<br>
<br>
===== warning : GLX/DRI2 is not supported/failed to authenticate =====
Qtプロジェクトをリモートデバッグする時、この警告が出力される場合がある。<br>
この警告は、他のソフトウェアが独自のmesaライブラリ(libEGLとlibGLESv2)を追加しているために表示される。<br>
<br>
まず、libEGLとlibGLESv2のパスを確認するため、以下のコマンドを実行する。<br>
(おそらく、/opt/vc/lib/libEGL.soと/opt/vc/lib/libGLESv2.soが表示される)<br>
sudo find / -iname "*egl*"
sudo find / -iname "*gles*"
<br>
上記で表示されたファイルのシンボリックファイルを、以下のディレクトリに作成する。<br>
# 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
<br>
<u>※注意</u><br>
<u>Debian等では、/usr/lib/x86_64-linux-gnu/mesa-eglディレクトリに存在する場合があるため、それに応じてコマンドを変更する必要がある。</u><br>
<br>
最後に、ライブラリファイルを読み込むため、以下のコマンドを実行する。<br>
sudo ldconfig
<br>
上記のシンボリックリンクの設定を元に戻す場合は、以下のように実行する。<br>
# 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
<br>
 
===== Note: Disabling X11 Accessibility Bridge: D-Bus or AT-SPI is missing. =====
Qtのソースコードにおいて、Configureスクリプトを実行する時、この注意が表示される場合がある。<br>
この時、Raspberry Piに対して、以下のライブラリをインストールする。<br>
sudo apt-get install at-spi2-core gir1.2-atspi-2.0 libatspi2.0-dev
<br>
==== QtWebEngineのビルドおよびインストール ====
上記のセクションでは、QtWebEngineモジュールを無効にしている。<br>
これは、QtWebEngineのビルドには多くの時間とディスクスペースが必要なためである。<br>
<br>
勿論、QtWebEngineとQtを同時にビルドすることも可能であるが、ビルドに失敗する場合はビルド全体が失敗したことになるため、<br>
まず、ベースとなるQt 5を個別にビルドした後、QtWebEngineを個別にビルドすることを推奨する。<br>
<br>
===== 依存関係のライブラリのインストール =====
<center>
{| class="wikitable" style="background-color:#fefefe;"
|+ 必須およびオプションのライブラリ
|-
! style="background-color:#00ffff;" | 
! style="background-color:#00ffff;" | ライブラリ名
! style="background-color:#00ffff;" | 備考
|-
| 必須 || flex bison gperf libre2-dev libnss3-dev ||
|-
| X11対応に必要 || libdrm-dev libxdamage-dev || XCB / X11を使用する場合、<br>これらのライブラリが必要である。
|-
| オプション || libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev<br>libevent-dev libprotobuf-dev protobuf-compiler libwebp-dev libpoppler-cpp-dev || 追加サポートとして便利である。
|-
| (オプション)<br>システム構築ツール || ninja-build re2c || ninjaビルドツールを使用することで、<br>ビルドを高速化できることがある。
|-
| 使用できないライブラリ || libopus-dev libvpx-dev || OpusとVPXメディアのサポートが追加されるが、<br>Raspbian busterで利用するには古すぎる。
|}
</center>
<br>
===== QtWebEngineのダウンロード =====
Qtの公式Webサイトから、QtWebEngineをダウンロードする。<br>
https://download.qt.io/official_releases/qt/x.x/x.x.x/submodules/qtwebengine-everywhere-src-x.x.x.tar.xz<br>
<br>
===== QtWebEngineのビルド設定 =====
ダウンロードしたQtWebEngineのビルド設定を編集する。<br>
<br>
QtWebEngineでのジャンボビルドを無効化する。<br>
標準のジャンボビルドシステムでは、コンパイル時に不明のエラーが出力されるため、無効にする。<br>
sed -i -e 's|use_jumbo_build=true|use_jumbo_build=false|' /<QtWebEngineのソースコードがあるディレクトリ>/src/buildtools/config/common.pri
<br>
===== QtWebEngineのビルドとインストール =====
次に、QtWebEngineのConfigureスクリプトを実行する。<br>
/opt/Qt/5.15.2/bin/qmake /<QtWebEngineのソースコードがあるディレクトリ> -- -no-webengine-geolocation
<br>
正常に終了する時、以下のようなサマリが表示される。<br>
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
<br>
最後に、QtWebEngineをビルドする。<br>
もし、ビルドするPCのメモリが8[GB]以下の場合、NINJAJOBSを4以下にして、Ninjaの並列ビルドの量を制限する必要がある。<br>
make -j $(nproc)
または
make -j 4 NINJAJOBS=-j4
make install
<br>
===== QtWebEngineのビルド時に発生する問題 =====
下表は、QtWebEngineで見つかった問題とビルドの問題を集めたものである。<br>
<center>
{| class="wikitable" style="background-color:#fefefe;"
|+ ビルド時の問題点と解決策
|-
! style="background-color:#00ffff;" | QtWebEngineのバージョン
! style="background-color:#00ffff;" | 問題
! style="background-color:#00ffff;" | 解決策
|-
| 5.15.2 || Internal Compiler Error, gcc 8.30<br><br>internal compiler error: in convert_move, at expr.c:218<br> static void exec_ops(const Op* ops, const void** args, || [https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96206 GCC Bugzilla bug report]<br><br>Build for ARMv7<br>Patch the source to disable optimization
|-
| 5.15.2 || fatal error: xcb/dri3.h: No such file or directory || 以下のライブラリをインストールする。<br><code>sudo apt-get install libxcb-dri3-dev</code>
|-
| 5.15.2 || Broadcom EGLを使用するQtのビルドに失敗する。<br><br>qtwebengine-everywhere-src-x.x.x/src/3rdparty/chromium/ui/gl/gl_bindings_autogen_egl.h:201:5:<br>error: ‘EGLDeviceEXT’ has not been declared || Broadcom EGLの代わりに、<br>VC4 / KMSを使用してビルドする。
|}
</center>
<br><br>
<br><br>