インストール - Qt5

提供: MochiuWiki : SUSE, EC, PCB

2021年4月17日 (土) 09:04時点におけるWiki (トーク | 投稿記録)による版 (エラー関連)

概要

ここでは、Qt 5.14のインストール方法を記載する。


通常のインストール

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

Qtの依存関係のライブラリをインストールする。
これらのライブラリは不要な可能性がある。(調査中)

sudo zypper install Mesa-devel Mesa-KHR-devel
または
sudo zypper install Mesa-KHR-devel Mesa-devel Mesa-dri-devel Mesa-libEGL-devel Mesa-libGL-devel Mesa-libGLESv1_CM-devel Mesa-libGLESv2-devel \
                    Mesa-libglapi-devel kbproto-devel libOSMesa-devel libOSMesa8 libX11-devel libXau-devel libdrm-devel libgbm-devel \
                    libglvnd-devel libxcb-devel libxcb-screensaver0 libxcb-xf86dri0 libxcb-xtest0 libxcb-xvmc0 pthread-stubs-devel xproto-devel


Qtのダウンロード

最新版のQtをダウンロードするため、以下のコマンドを実行する。
ファイル情報を知りたい場合はこのWebサイトを参照する。

wget http://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run

ダウンロードしたファイルのアクセス権限を変更する。

chmod +x qt-unified-linux-x64-online.run


Qtのインストール

/usr/localディレクトリ等にインストールする場合は、スーパーユーザでインストールする。
ホームディレクトリにインストールする場合は、ローカルユーザでインストールする。

次に、GCCおよびmake、付随するライブラリをインストールする。

# CentOS
sudo yum groupinstall "Development tools"

# SUSE
sudo zypper install --type pattern devel_basis


Qtをインストールする。

./qt-unified-linux-x64-online.run


Qtのインストール画面に従って、インストールを実行する。


ソースコードからインストール

必須環境

  • Qt 5.14.0以降
  • Qt WebEngine module for QtWebEngine based help viewer
  • GCC 7以降
  • オプション : CMake
    CMakeを使用してLLVM / ClangとQt Creatorをビルドする時に必要である。
  • オプション : Ninja
    CMakeを使用してビルドする時に必要である。
  • オプション : LLVM / Clang 8.0.0以降
    Clang Code Model、Clang Tools、ClangFormat、Clang PCH Manager、Clang Refactoringプラグインに必要である。
    LLVM C++ APIは互換性を保証するものではないので、それ以降のバージョンがコンパイルできない場合は、そのバージョンをサポートしていない。
  • オプション : Qbs 1.7.x
    Qtのソースコードには、Qbs自身も含まれている。


また、Qtをビルドする時のオプション設定を以下に記載する。

# オプション : 環境変数PATHにおいて、llvm-configのパスが通っていない場合に必要である
export LLVM_INSTALL_DIR=<LLVMのインストールディレクトリ>

# オプション : Clangのリファクタリングを無効にする場合、1を設定する
export QTC_DISABLE_CLANG_REFACTORING=1

# オプション : QbsProjectManagerプラグインがQbsを使用する場合に必要である
export QBS_INSTALL_DIR=/path/to/qbs

# オプション : KSyntaxHighlightingを使用する場合、KSYNTAXHIGHLIGHTING_LIB_DIRライブラリを保持するディレクトリを設定する
# インクルードディレクトリの自動推定に失敗する場合、KSYNTAXHIGHLIGHTING_INCLUDE_DIRを設定して、
# 両方の設定をqmakeコマンドのオプションで渡すこともできる
export KSYNTAXHIGHLIGHTING_INCLUDE_DIR=<インクルードファイルを保持するディレクトリ>
export KSYNTAXHIGHLIGHTING_LIB_DIR=<ライブラリを保持するディレクトリ>


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

Qtのソースコードをコンパイルするために必要な依存関係のライブラリをインストールする。

sudo zypper install git-core gcc-c++ make python3 perl \
                    xorg-x11-libxcb-devel xcb-util-devel xcb-util-image-devel xcb-util-keysyms-devel xcb-util-renderutil-devel \
                    xcb-util-wm-devel xorg-x11-devel libxkbcommon-x11-devel libxkbcommon-devel libXi-devel \
                    flex bison gperf libicu-devel ruby \
                    alsa-devel dbus-1-devel libXcomposite-devel libXcursor-devel libXrandr-devel libXtst-devel mozilla-nspr-devel \
                    mozilla-nss-devel gperf bison nodejs10 nodejs10-devel \
                    pulseaudio-libs-devel alsa-lib-devel gstreamer1-devel gstreamer1-plugins-base-devel wayland-devel


  • fontconfig-devel
  • libfontenc-devel
  • libXft-devel
  • libx11-devel
  • libxcb-devel
  • libXext-devel
  • libXfixes-devel
  • libXrender-devel
  • libxcb-devel
  • Mesa-libGL-devel
  • xcb-util-keysyms-devel
  • xcb-util-image-devel
  • xcb-util-wm-devel
  • libXfixes-devel
  • xcb-util-renderutil-devel
  • libXinerama-devel
  • libxcb-shm0-dev
  • libxcb-sync0-dev
  • libxcb-shape0-dev


ソースコードのダウンロード

Qtのソースコードをダウンロードする。

git clone --recursive https://code.qt.io/qt-creator/qt-creator.git


ソースコードのビルド

Qtのソースコードをビルドするため、ビルド用のディレクトリを作成する。

mkdir build
cd build


  • qmakeを使用する場合
    オプションのClang Code Modelプラグインをビルドする場合、LLVMのインストールディレクトリへのパスを指定する必要がある。
    export LLVM_INSTALL_DIR=<LLVMのインストールディレクトリ>
    qmake ../qt-creator/qtcreator.pro
    make qmake_all
    make -j 8
    もし、Project ERROR: Unknown module(s) in QT: scriptというエラーが出力される場合、以下のコマンドを実行する。
    make -j 8 module-qtscript

  • cmakeを使用する場合
    Qtのソースコードをビルドする。
    cmake -G Ninja -D CMAKE_BUILD_TYPE=Release -D CMAKE_PREFIX_PATH=<Qtのインストールディレクトリ>; <LLVMのインストールディレクトリ> ../qt-creator
    cmake --build ..


コンパイルには時間が掛かるので気長に待つ。(バイナリファイルは、qt-createor-build/binディレクトリに作成される)

Qtのインストール

Qtをインストールする。

make install INSTALL_ROOT=<Qtのインストールディレクトリ>



デスクトップエントリの追加

以下のコマンドを実行して、デスクトップエントリを追加する。

sudo vi /usr/share/applications/qtcreator.desktop

# qtcreator.desktopファイル
[Desktop Entry]
Type=Application
Exec="/home/ユーザ名/Qt/Tools/QtCreator/bin/qtcreator" %F
Name=Qt Creator
GenericName=The IDE of choice for Qt development.
Icon=QtProject-qtcreator
StartupWMClass=qtcreator
Terminal=false
Categories=Development;IDE;Qt;
MimeType=text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;application/vnd.qt.qmakeprofile;application/vnd.qt.xml.resource;text/x-qml;text/x-qt.qml;text/x-qt.qbs;


sudo vi /usr/share/applications/Qt-MaintenanceTool.desktop

# Qt-MaintenanceTool.desktopファイル
[Desktop Entry]
Type=Application
Exec=/home/ユーザ名/Qt/MaintenanceTool
Path=/home/ユーザ名/Qt
Name=Qt Maintenance Tool
GenericName=Install or uninstall Qt components.
Icon=/home/ユーザ名/Qt/QtIcon.png
Terminal=false
Categories=Development;Qt;


sudo vi /usr/share/applications/qt-project.qtdesigner.desktop

# qt-project.qtdesigner.desktopファイル
[Desktop Entry]
Type=Application
Exec="/home/ユーザ名/Qt/5.14.0/gcc_64/bin/designer" %F
Name=Qt Designer
GenericName=Qt designer
Icon=/home/ユーザ名/Qt/designer.png
StartupWMClass=qtdesigner
Terminal=false
Categories=Development;IDE;Qt;
MimeType=text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;application/vnd.qt.qmakeprofile;application/vnd.qt.xml.resource;text/x-qml;text/x-qt.qml;text/x-qt.qbs;



Raspberry Pi 3B / 4Bのクロスコンパイル

概要

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

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

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

このセクションでは、Raspberry PiにRaspbian Busterをインストールしていることを想定している。

Linux PCの設定

Linux PCにおいて、以下の依存関係のライブラリをインストールする。
(Texinfoは、GNU公式Webサイトにアクセスして、ソースコードからインストールすることを推奨する)

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


Raspberry Pi専用のGCC ARMツールチェインをダウンロードする。
https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/

表. GCC ARMツールチェーンのダウンロード
Raspberry Piの種類 Raspbian Stretch(32-bit) Raspbian Buster(32-bit)
Raspberry Pi Zero/W/WH
Raspberry Pi 1 Model A / B / A+ / B+
6.3.0
9.3.0
10.2.0
8.3.0
9.3.0
10.2.0
Raspberry Pi 2 Model A / B
Raspberry Pi 3 Model A / B
6.3.0
9.3.0
10.2.0
8.3.0
9.3.0
10.2.0
Raspberry Pi 3 Model A+ / B+
Raspberry Pi 4 Model A+ / B+
Raspberry Pi Compute 3 / 3lite / 3+
6.3.0
8.3.0
10.2.0
8.3.0
9.3.0
10.2.0


また、Linero社が提供しているGCC ARMツールチェーンも使用することができる。
https://releases.linaro.org/components/toolchain/binaries/

wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
tar xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz


GCC ARMツールチェインを解凍して、任意のディレクトリに配置する。
ここでは、~/InstallSoftware/GCC_ARMディレクトリに配置している。

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


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

Raspberry Pi 4は、Broadcom BCM2711 SoC(Cortex-A72 64bit)を採用しており、Raspberry Pi 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
Raspberry Pi 3 Model A / B
-march=armv7-a -mfloat-abi=hard -mfpu=neon-vfpv4
Raspberry Pi 3 Model A+ / 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を256[MB]程度に変更する。
sudo raspi-config
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ファイル

# 編集前
#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


Raspbian Busterのソフトウェアおよびファームウェアをアップデートする。

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


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

# Raspberry Pi 3B
# EGLを使用する場合
sudo apt-get install ccache libicu-dev icu-devtools libhidrd0 libhidrd0-dev libzstd1 libzstd-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
                     python (QtQuickを使用する場合) \
                     libgtk-3-dev (QtWidget向けにGTKネイティブテーマを使用する場合)

# XCBを使用する場合
sudo apt-get install ccache libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-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 \
                     libxcb-xinerama0 libxcb-xinerama0-dev gdbserver \
                     python (QtQuickを使用する場合) \
                     libgtk-3-dev (QtWidget向けにGTKネイティブテーマを使用する場合) \
                     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

# Raspberry Pi 4B
# EGLを使用する場合
sudo apt-get install ccache libicu-dev icu-devtools libhidrd0 libhidrd0-dev libzstd1 libzstd-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
                     python (QtQuickを使用する場合) \
                     libgtk-3-dev (QtWidget向けにGTKネイティブテーマを使用する場合)

# XCBを使用する場合
sudo apt-get install ccache libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-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 \
                     libxcb-xinerama0 libxcb-xinerama0-dev gdbserver \
                     python        (QtQuickを使用する場合) \
                     libgtk-3-dev  (QtWidget向けにGTKネイティブテーマを使用する場合) \
                     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
sudo apt-get build-dep libqt5webengine-data (WebEngineを使用する場合)
sudo apt-get build-dep libqt5webkit5        (WebKitを使用する場合)


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

その他のライブラリ(オプション)
機能 インストールするライブラリ 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
マルチメディア 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 libsndio7.0 libopenal1 libopenal-dev
データベース libpq-dev(PostgreSQL)
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
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
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
アクセシビリティ libatspi-dev
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


Raspberry Pi 4Bの場合、以下のシンボリックリンクを作成する。

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


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

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

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


SysRootディレクトリの設定

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
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/opt/vc ~/Program/Qt_Embedded/sysroot/opt


ダウンロードしたファイルおよびディレクトリのシンボリックリンクを相対的に調整する。
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ライブラリのダウンロード

Raspberry Pi 3B /4B 共通

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

以下のコマンドにおいて、<Qtのバージョン>および<Qtのショートバージョン>は、ダウンロードするQtのバージョンに変更する。
例えば、Qt 5.15.2をダウンロードする場合、5.15.2と入力する。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


Raspberry Pi 4B

Raspberry Pi 4Bの場合、以下のように、qmake.confをカスタマイズする必要がある。
qmake.confファイルは、ビルド時の設定を定義するものである。

cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
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
または
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


Raspberry Pi 3B (EGLを使用する場合)
  • 方法 1

Raspberry Pi 3Bの場合も、以下のように、qmake.confをカスタマイズする必要がある。

cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
cp -r linux-rasp-pi3-g++ linux-rasp-pi3-brcm-g++
vi linux-rasp-pi3-brcm-g++/qmake.conf


# 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)


Raspberry Pi 3Bの場合、上記で作成したqmake.confファイルを使用する必要がある。
これは、Qtをビルドする時、pkg-configを使用して、どのライブラリがどの場所にインストールされているかを判断する。

実際には複数の方法があるが、最良の方法は、上記で作成したqmake.confファイルの静的な定義を使用することである。
そこで、.pcファイルを削除して、configureがMesaのデフォルトを使用せずに、上記の定義を使用する。

cd /<sysrootが存在するディレクトリ>/sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig
mv egl.pc egl.pc.mesa
mv glesv2.pc glesv2.pc.mesa


  • 方法 2
cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
cp -r linux-rasp-pi2-g++ linux-rasp-pi3-ex-g++
vi linux-rasp-pi3-ex-g++/qmake.conf


# 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


次に、以下のソースコードを編集する。

vi /<Qtのソースコードが存在するディレクトリ>/qtbase/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglwindow.cpp


# 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);


SysRootディレクトリから、nss.pcファイルがあるディレクトリに対して、パスを追加する。

find <SysRootディレクトリ> -type f -name nss.pc

export PKG_CONFIG_PATH=<nss.pcファイルが存在するディレクトリ>


  • 方法 3

この方法は、qt-everywhere-src-5.x.xファイルのみで実行できる。

Githubから、mkspecsを自動編集するツールをダウンロードする。
このツールでは、libbrcm*.soライブラリ名を参照するように設定されている。

git clone https://github.com/oniongarlic/qt-raspberrypi-configuration.git


ツールをQtのソースコードがあるディレクトリにインストールする。

cd ./qt-raspberrypi-configuration
make install DESTDIR=<Qtのソースコードがあるディレクトリ>/qt-everywhere-src-5.x.x


Qtライブラリのビルド

ここでは、Qtソフトウェアは~/Program/Qt_Embedded/QtSoftwareディレクトリ、qmake等のホストツールは~/Program/Qt_Embedded/Hostディレクトリ、
Qtライブラリは~/Program/Qt_Embedded/Targetディレクトリとしている。

<Raspberry Piのバージョン>は、Raspberry Piの種類に変更する。
ただし、上記のセクションでmkspecを変更した場合は、そのディレクトリ名に合わせること。

  • <Raspberry Piのバージョン>
    • Raspberry Pi 1
      linux-rasp-pi-g++
    • Raspberry Pi 2
      linux-rasp-pi2-g++
    • Reaspberry Pi 3
      linux-rasp-pi3-g++(EGL)またはlinux-rasp-pi3-vc4-g++(XCB)または上記のセクションで作成したlinux-rasp-pi3-brcm-g++(EGL)等
    • Raspberry Pi 4
      linux-rasp-pi4-v3d-g++


Raspbian OS 64bitを使用している場合は、-device-optionオプションを以下のように記述する。
-device-option CROSS_COMPILE=/<GCC ARMツールチェインのインストールディレクトリ>/bin/aarch64-linux-gnueabihf-
また、Qt 5.8以降は、-no-use-gold-linkerオプションを追加する必要がある。

  • QtBase / Qt Everywhere Opensource / GithubからダウンロードしたQt
    ビルドディレクトリの作成
    mkdir /<Qtのソースコードがあるディレクトリ>/../build && cd /<Qtのソースコードがあるディレクトリ>/../build

    Configureスクリプトの実行
    PKG_CONFIG_LIBDIR=/<SysRootがあるディレクトリ>/usr/lib/arm-linux-gnueabihf/pkgconfig:/<SysRootがあるディレクトリ>/usr/share/pkgconfig \
    ../<Qtのソースコードがあるディレクトリ>/qtbase/configure -release \
    -opengl es2 -eglfs \      EGLを使用する場合
    -opengl es2 \          XCBを使用する場合
    -device <Raspberry Piのバージョン> \
    -device-option CROSS_COMPILE=/<GCC ARMツールチェーンのインストールディレクトリ>/bin/arm-linux-gnueabihf- \
    -sysroot /<SysRootがあるディレクトリ>/sysroot \
    -opensource -confirm-license -v -nomake examples -nomake tests -make libs -no-use-gold-linker -recheck-all -pkg-config \
    -qpa eglfs \          EGLを使用する場合
    -bundled-xcb-xinput -qpa xcb \ XCBを使用する場合
    -skip qtscript -skip qtwayland -skip qtwebengine \
    -prefix /<Qtソフトウェアを配置するディレクトリ>/QtSoftware \
    -extprefix /<Raspberry PiにインストールするQtライブラリを配置するディレクトリ>/Target \
    -hostprefix /<Linux PCで使用するQtライブラリを配置するディレクトリ>/Host
    -L/<SysRootがあるディレクトリ>/sysroot/usr/lib/arm-linux-gnueabihf \   # 不要の可能性あり
    -I/<SysRootがあるディレクトリ>/sysroot/usr/include/arm-linux-gnueabihf \ # 不要の可能性あり

    ビルドおよびインストール
    gmake -j $(nproc)
    gmake install

    もし、Linux PCで使用するQtライブラリを配置するディレクトリにrccファイルが存在しない場合は、rccファイルをQtライブラリのbinディレクトリにコピーする。
    (Qtライブラリを使用するソフトウェアをビルドする時、rccファイルが必要である)
    cp /<Qtのソースコードがあるディレクトリ>/qtbase/bin/rcc /<Linux 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ライブラリを読み込むようにするため、以下のコマンドを実行する。
/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ソフトウェアをビルドして、動作確認を行う。

EGLを使用する場合

Raspberry Piで、EGL / GLESライブラリを修正する。
Raspberry Piの/usr/lib/arm-linux-gnueabihfディレクトリには、MesaのlibEGLとlibGLESv2が存在する。
Qtソフトウェアは、/opt/vc/libディレクトリにあるライブラリではなく、これらを選択することになる。

これは、OpenGLのパフォーマンスを気にしないX11デスクトップソフトウェアには都合が良いが、
フルスクリーンの組み込みソフトウェアをウィンドウ化するには全く役に立たない。

必ず、元のファイルはバックアップすること。

sudo mv /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0_org
sudo mv /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0_org
sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
sudo ln -s /opt/vc/lib/libbrcmEGL.so /opt/vc/lib/libEGL.so
sudo ln -s /opt/vc/libbrcmGLESv2.so /opt/vc/libGLESv2.so


また、見つからないシンボリックリンクも追加する。

sudo ln -s /opt/vc/lib/libEGL.so /opt/vc/lib/libEGL.so.1
sudo ln -s /opt/vc/libGLESv2.so /opt/vc/lib/libGLESv2.so.2


XCBを使用する場合

まず、Qt Creatorを起動して、Qt Creatorメイン画面左の[プロジェクト] - 右ペインの[ビルド設定] - [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


EGL / XCB 共通

Qtソフトウェアのサンプルをダウンロードする。
この時、<Qtソフトウェアのサンプル>と<Qtのバージョン>は合致するものを指定すること。

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ソフトウェアを配置するディレクトリ>


最後に、QtソフトウェアをRaspberry Piにデプロイする。

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


エラー関連

warning : GLX/DRI2 is not supported/failed to authenticate

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

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

sudo find / -name libEGL*
sudo find / -name libGLESv2*


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

sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2


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

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

sudo ldconfig