Ubuntu 20 LTSでのRaspberry Compute Module 4のQt 5.15クロスコンパイル

イントロダクション

これは、Raspberry Pi4用にQt5.15.2をクロスコンパイルし、Compute Module 4にインストールするためのガイドです。これは、私のブログ投稿のRaspberry Pi 4上のQtの更新ですが、今回はRaspberry Pi OS Liteを使用している点が異なります(ここからダウンロード: https://www.raspberrypi.org/software/operating-systems/)、Qtバージョン5.15.2、およびクロスコンパイルコンピューターとしての仮想マシン内のUbuntu 20LTSを使用します。### ソース

上に示した古い私のブログの投稿のほかに、このソースも参照しました。- Uvindu Wijesingheからは: https://github.com/UvinduW/Cross-Compiling-Qt-for-Raspberry-Pi-4

Raspberry Pi OS Lite

私のブログ投稿Raspberry Pi OSをRaspberry Compute Module 4にインストールで説明されているように、Raspberry Pi OS LiteをRaspberry Pi 4またはRaspberry Compute Module 4にインストールします。## Ubuntu 20 LTSのQt 5.15.2

Raspberry Pi OSがコンピューターのモジュールにインストールされ、RaspberryがeMMCストレージから再起動したら、必要なソフトウェアをRaspberryとUbuntuにインストールします。### Raspberry Compute Module 4

以下に示す手順は、「通常の」Raspberry Pi 4でも機能するはずです。Pi 4の電源を入れた後、設定メニューを呼び出します。

sudo raspi-config

この設定では、「SSH」と「GL(Fake KMS)」が必要です。次の2つのスクリーンショットを参照してください。.

SSH Konfiguration

FKMS Konfiguration

-次に、/etc/apt/sources.listに開発ソースを入力します。これを行うには、次の行を追加します。

deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
  • 次に、このコードを利用してシステムをアップデートします。
sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot
sudo rpi-update
sudo reboot

そうして、必要なQt発展パッケージをインストールします。

sudo apt-get build-dep qt5-qmake
sudo apt-get build-dep libqt5gui5
sudo apt-get build-dep libqt5webengine-data
sudo apt-get build-dep libqt5webkit5
sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0 gdbserver

次にRaspberryQtのほかのディレクトリを作ります。

sudo mkdir /usr/local/qt5.15
sudo chown -R pi:pi /usr/local/qt5.15

Ubuntuの機械

Ubuntu 20 LTSがインストールされたPCまたは仮想マシンが必要です。まず最初に、Ubuntuを最新の状態にして、いくつかの必要なライブラリをインストールします。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gcc git bison python gperf pkg-config gdb-multiarch
sudo apt install build-essential

次に、まだ存在しない場合は、sshキーを生成してRaspberryにインストールします。これにより、パスワード要求が発生せず、同期を実行するたびにユーザー名とパスワードを入力する必要がなくなります。これについてはオンラインで十分な説明があるので、ここで詳細な説明はカットしておきます。#### Raspberryライブラリのディレクトリ構造を作成する

必要なファイルについて、Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4の下に次のディレクトリ構造を作成します。

sudo mkdir ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4
sudo mkdir ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/build
sudo mkdir ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/tools
sudo mkdir ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/sysroot
sudo mkdir ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/sysroot/usr
sudo mkdir ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/sysroot/opt
sudo chown -R 1000:1000 ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4
cd ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4

Qtリソースのダウンロード

Qtリソースをダウンロードし、raspberrypi4ディレクトリに解凍します。

sudo wget http://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz
sudo tar xfv qt-everywhere-src-5.15.2.tar.xz

次に、mkspecファイルを少し変更して、コンパイラで使用できるようにする必要があります。これを行うには、次のコマンドを実行します。

cp -R qt-everywhere-src-5.15.2/qtbase/mkspecs/linux-arm-gnueabi-g++ qt-everywhere-src-5.15.2/qtbase/mkspecs/linux-arm-gnueabihf-g++
sed -i -e 's/arm-linux-gnueabi-/arm-linux-gnueabihf-/g' qt-everywhere-src-5.15.2/qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf

クロスコンパイラのダウンロード

クロスコンパイラーとしてLinaroのバージョン7.4.1を使用しています。これを行うには、Toolsディレクトリに移動し、コンパイラをダウンロードして解凍します。

cd  tools
sudo wget https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/arm-linux-gnueabihf/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf.tar.xz
tar xfv gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf.tar.xz

Raspberryライブラリのrsync

次に、rsyncを使用してUbuntuディレクトリにコピーする元のRaspberryPiライブラリも必要です。

cd ..
rsync -avz --rsync-path="sudo rsync" --delete [email protected]:/lib sysroot/
rsync -avz --rsync-path="sudo rsync" --delete [email protected]:/usr/include sysroot/usr/
rsync -avz --rsync-path="sudo rsync" --delete [email protected]:/usr/lib sysroot/usr/
rsync -avz --rsync-path="sudo rsync" --delete [email protected]:/opt/vc sysroot/opt/

ここでも、rsyncによってコピーされた象徴的なリンクをクリーンアップして、正しい元のファイルを指すようにする必要があります。このためにダウンロードする小さなPythonのスクリプトがあります:

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py

次に、スクリプトを実行可能にして、次のように呼び出します。

sudo chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

Qtのコンパイル

これで、ビルドを設定してからコンパイルできます。

cd build
../qt-everywhere-src-5.15.2/configure -release -opengl es2  -eglfs -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/tools/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/sysroot -prefix /usr/local/qt5.15 -extprefix ~/Documents/Qt-CrossCompile-RaspberryPi/raspberrypi4/qt5.15 -opensource -confirm-license -skip qtscript -skip qtwayland -skip qtwebengine -nomake tests -make libs -pkg-config -no-use-gold-linker -v -recheck

数分後、スクリプトが完了し、場合によっては、次のEGLFS条件が設定/未設定になっているはずです。

QPA backends:
  DirectFB ............................... no
  EGLFS .................................. yes  [SHOULD BE YES]
  EGLFS details:
    EGLFS OpenWFD ........................ no
    EGLFS i.Mx6 .......................... no
    EGLFS i.Mx6 Wayland .................. no
    EGLFS RCAR ........................... no
    EGLFS EGLDevice ...................... yes  [SHOULD BE YES]
    EGLFS GBM ............................ yes
    EGLFS VSP2 ........................... no
    EGLFS Mali ........................... no
    EGLFS Raspberry Pi ................... no   [SHOULD BE NO]
    EGLFS X11 ............................ yes
  LinuxFB ................................ yes
  VNC .................................... yes

そうでない場合、またはその他のエラーメッセージが表示された場合は、調査して修正してください。変数を変更して設定スクリプトを再度実行する場合は、事前にビルドディレクトリの内容を削除してください。すべて問題がなければ、コマンド「make」と「makeinstall」を実行します。

make -j4
make install

コンパイルされたファイルをRaspberryにインストールする

コンパイルが成功した場合、コンパイルされたファイルである、qt5.15ディレクトリにあるファイルをRaspberryPiにコピーできます。これは、rsyncコマンドを再度使用して行います。

rsync -avz --rsync-path="sudo rsync" qt5.15 [email protected]:/usr/local/

QtCreatorの設定

次のブログの投稿、投稿では、コンパイルされたライブラリを使用してデプロイするためにQtCreatorを使用する方法について説明します。