インストール - Qt5 Raspberry Pi
概要
Raspberry Piにおいて、一般的なデスクトップソフトウェアのクロスコンパイルおよび組み込み / デバイス作成のユースケースのクロスコンパイルを行う手順を記載する。
組み込み / デバイス作成とは、デスクトップソフトウェアをX11の下で実行するためのものではなく、
ソフトウェアがBroadcomドライバを使用して、dispmanx / EGLの上でフルスクリーンで実行するというユースケースのことである。
EGLを使用する場合、Qtソフトウェアはフルスクリーンでのみ動作する。
一般的なデスクトップウインドウで起動する場合はXCBを使用する必要があるが、XCBはOpenGLやQt Quickは動作しないことに注意すること。
このページでは、Raspberry Pi OS Bullseye / Bookwormをインストールしていることを想定している。
※注意
Raspberry Pi OS Bullseye以降は、画面を描画するためのVCドライバは存在しない。
もし、VCドライバが必要な場合は、Raspbian OS Busterを使用すること。(非推奨)
ホスト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ツールチェーン、または、それ以前のものを使用する。
- GCCツールチェーン群
- GCC 10.2 (Bullseye 32ビット向け)
- GCC 10.2 (Bullseye 64ビット向け)
# 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 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 4BでQt 5.15を実行するには、KMSを使用する必要がある。
libgles2-mesa-devおよびlibgbm-devがインストールされていることを確認すること。
- 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 \ libssl-dev libssl1.0-dev libnss3-dev \ libfontconfig1-dev libdbus-1-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 # Raspberry Pi 3B / 3B+の場合、かつ、Raspberry Pi OS 32ビットを使用する場合 libgles2-mesa-dev libgbm-dev # Raspberry Pi 4Bを使用する場合 ## 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 libxkbcommon-dev libjpeg-dev libasound2-dev libudev-dev \ libssl-dev libssl1.0-dev libnss3-dev \ libgles2-mesa-dev libxcb-xinerama0 libxcb-xinerama0-dev \ 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 # Raspberry Pi 3B / 3B+の場合、かつ、Raspberry Pi OS 32ビットを使用する場合 libgles2-mesa-dev libgbm-dev # Raspberry Pi 4Bを使用する場合
- Raspberry Pi OS Bookworm
## 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 libsepol-dev libwacom-dev \ libfontconfig1-dev libdbus-1-dev libxkbcommon-dev libjpeg-dev libasound2-dev libudev-dev \ libssl-dev libssl1.0-dev libnss3-dev gdbserver \ libgles2-mesa-dev libxcb-xinerama0 libxcb-xinerama0-dev libgtk-3-dev # QtWidget向けにGTKネイティブテーマを使用する場合 libraspberrypi-dev # Raspberry Pi 3B / 3B+の場合、かつ、Raspberry Pi OS 32ビットを使用する場合 libgles2-mesa-dev libgbm-dev # Raspberry Pi 4Bを使用する場合 ## 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 libsepol-dev libwacom-dev \ libfontconfig1-dev libdbus-1-dev libxkbcommon-dev libjpeg-dev libasound2-dev libudev-dev \ libssl-dev libssl1.0-dev libnss3-dev gdbserver \ libgles2-mesa-dev libxcb-xinerama0 libxcb-xinerama0-dev \ 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 libgtk-3-dev # QtWidget向けにGTKネイティブテーマを使用する場合 libraspberrypi-dev # Raspberry Pi 3B / 3B+の場合、かつ、Raspberry Pi OS 32ビットを使用する場合 libgles2-mesa-dev libgbm-dev # Raspberry Pi 4Bを使用する場合
# その他 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-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-pulseaudio gstreamer1.0-tools gstreamer1.0-alsa 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 32ビットOSを使用する場合
QMAKE_CFLAGS = -march=armv8-a -mtune=cortex-a72 -mfpu=crypto-neon-fp-armv8
# Raspberry Pi 4B 64ビットOSを使用する場合
QMAKE_CFLAGS = -march=armv8-a -mtune=cortex-a72
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 32ビットOSを使用する場合
QMAKE_CFLAGS = -march=armv8-a -mtune=cortex-a72 -mfpu=crypto-neon-fp-armv8
# Raspberry Pi 4B 64ビットOSを使用する場合
QMAKE_CFLAGS = -march=armv8-a -mtune=cortex-a72
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.x/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.x/configure -release \
-device linux-raspberrypi-new-g++ \
-device-option CROSS_COMPILE=$CROSS_COMPILE \
-opensource -confirm-license -v \
-opengl es2 \ # XCBを使用する場合
-qpa xcb \ # XCBを使用する場合
-no-feature-eglfs_brcm \ # 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ライブラリをインストールするディレクトリ>
エラー関連
ビルドエラー : QtBase
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;"
]
GCC 11以降を使用する場合
GCC 11以降のツールチェーンを使用する場合、Qt 5.15のビルド時において、以下に示すエラーが発生する場合がある。
error: 'numeric_limits' is not a member of 'std' static_cast<quint16>(numbers.size()) : std::numeric_limits<quint16>::max(); error: expected primary-expression before '>' token static_cast<quint16>(numbers.size()) : std::numeric_limits<quint16>::max(); error: '::max' has not been declared; did you mean 'std::max'? static_cast<quint16>(numbers.size()) : std::numeric_limits<quint16>::max();
これは、std::limitsが削除されて、limits.hファイルに移行されたからである。
もし、GCC 11以降を使用してQt 5.15をビルドする場合は、qt-everywhere-src-5.15.x/qtbase/src/corelib/global/qglobal.hファイルを、以下に示すように編集する。
vi qt-everywhere-src-5.15.x/qtbase/src/corelib/global/qglobal.h
// qt-everywhere-src-5.15.x/qtbase/src/corelib/global/qglobal.hファイル
// 45〜48行目あたり
// 編集前
#ifdef __cplusplus
# include <type_traits>
# include <cstddef>
# include <utility>
#endif
// 編集後
#ifdef __cplusplus
# include <type_traits>
# include <cstddef>
# include <utility>
#include <limits>
#endif
デバッグエラー : 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
デバッグエラー : プラットフォームの選択
デバッグ実行開始直後に、以下に示すようなエラーが表示される場合がある。
qt.qpa.plugin: Could not load the Qt platform plugin "eglfs" in "/home/raspi/InstallSoftware/Qt_5_15_13/plugins/platforms" even though it was found. This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, webgl, xcb.
これは、GUIソフトウェアの実行時において、デフォルトのプラットフォームを選択していないことに起因する。
実行時のコマンドライン引数において、-platform <パラメータ>
を指定することにより、実行するプラットフォームを選択することができる。
- EGLFSで実行する場合
-platform eglfs
- XCBで実行する場合
-platform xcb
libEGL warning: DRI2: failed to authenticate - Raspberry Pi OS Bullseye以降
以下のコマンドを実行する。
sudo raspi-config
次に、Raspberry Pi 3Bの場合は、[Advanced Options] - [A2 GL Driver] - [G2 GL (Full KMS)]を選択する。(KMSが有効になる)
Raspberry Pi 4Bの場合は、[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を使用してビルドする。 |
CLion / Qt 5との連携
CMakeツールチェーンファイルの作成
任意のディレクトリにCMakeツールチェーンファイルの作成する。
vi /<任意のディレクトリ>/ToolChain_for_Raspberry_Pi.cmake
# Raspberry Pi OS 32ビット向け
# 64ビットを使用する場合は、"arm-linux-gnueabihf"の部分を"aarch64-linux-gnu"へ変更すること
# /<任意のディレクトリ>/ToolChain_for_Raspberry_Pi.cmakeファイル
cmake_minimum_required(VERSION 3.18)
include_guard(GLOBAL)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(TARGET_SYSROOT <Raspberry Piのシステムルートディレクトリ>)
set(CMAKE_SYSROOT ${TARGET_SYSROOT})
set(ENV{PKG_CONFIG_PATH} $PKG_CONFIG_PATH:${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/lib/arm-linux-gnueabihf/pkgconfig)
set(ENV{PKG_CONFIG_LIBDIR} /usr/lib64/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig/:${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/lib/arm-linux-gnueabihf/pkgconfig:${TARGET_SYSROOT}/usr/share/pkgconfig)
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})
set(CMAKE_C_COMPILER /<GCCツールチェーンのインストールディレクトリ>/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /<GCCツールチェーンのインストールディレクトリ>/bin/arm-linux-gnueabihf-g++)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${TARGET_SYSROOT}/usr/include -I${TARGET_SYSROOT}/usr/include/arm-linux-gnueabihf")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib/arm-linux-gnueabihf")
set(CMAKE_MODULE_LINKER_FLAGS_INIT "-Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib/arm-linux-gnueabihf")
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib/arm-linux-gnueabihf")
# Raspberry Pi 3Bの場合
set(QT_COMPILER_FLAGS "march=armv8-a -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8")
# Raspberry Pi 4Bの場合
set(QT_COMPILER_FLAGS "march=armv8-a -mtune=cortex-a72 -mfpu=crypto-neon-fp-armv8")
set(QT_COMPILER_FLAGS_RELEASE "-O2 -pipe")
set(QT_LINKER_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_BUILD_RPATH ${TARGET_SYSROOT})
set(XCB_PATH_VARIABLE ${TARGET_SYSROOT})
set(GL_INC_DIR ${TARGET_SYSROOT}/usr/include)
set(GL_LIB_DIR ${TARGET_SYSROOT}:${TARGET_SYSROOT}/usr/lib/arm-linux-gnueabihf/:${TARGET_SYSROOT}/usr:${TARGET_SYSROOT}/usr/lib)
set(EGL_INCLUDE_DIR ${GL_INC_DIR})
set(EGL_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/arm-linux-gnueabihf/libEGL.so)
set(OPENGL_INCLUDE_DIR ${GL_INC_DIR})
set(OPENGL_opengl_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/arm-linux-gnueabihf/libOpenGL.so)
set(GLESv2_INCLUDE_DIR ${GL_INC_DIR})
set(GLIB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/arm-linux-gnueabihf/libGLESv2.so)
set(GLESv2_INCLUDE_DIR ${GL_INC_DIR})
set(GLESv2_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/arm-linux-gnueabihf/libGLESv2.so)
set(gbm_INCLUDE_DIR ${GL_INC_DIR})
set(gbm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/arm-linux-gnueabihf/libgbm.so)
set(Libdrm_INCLUDE_DIR ${GL_INC_DIR})
set(Libdrm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/arm-linux-gnueabihf/libdrm.so)
set(XCB_XCB_INCLUDE_DIR ${GL_INC_DIR})
set(XCB_XCB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/arm-linux-gnueabihf/libxcb.so)
Qt 5向けCMakeツールチェーン設定ファイルの作成
Raspberry Pi向けのQt 5ライブラリのインストールディレクトリ内のlib/cmake/Qt5ディレクトリにCMakeツールチェーン設定ファイルの作成する。
vi /<Qt 5ライブラリのインストールディレクトリ>lib/cmake/Qt5/qt.toolchain.cmake
# /<Qt 5ライブラリのインストールディレクトリ>lib/cmake/Qt5/qt.toolchain.cmakeファイル
set(__qt_toolchain_used_variables
QT_CHAINLOAD_TOOLCHAIN_FILE
QT_TOOLCHAIN_INCLUDE_FILE
QT_TOOLCHAIN_RELOCATABLE_CMAKE_DIR
QT_TOOLCHAIN_RELOCATABLE_PREFIX
QT_ADDITIONAL_PACKAGES_PREFIX_PATH
)
list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES ${__qt_toolchain_used_variables})
list(REMOVE_DUPLICATES CMAKE_TRY_COMPILE_PLATFORM_VARIABLES)
if($ENV{_QT_TOOLCHAIN_VARS_INITIALIZED})
foreach(var ${__qt_toolchain_used_variables})
set(${var} "$ENV{_QT_TOOLCHAIN_${var}}")
endforeach()
endif()
set(__qt_initially_configured_toolchain_file "<上記で作成したRaspberry Pi向けCMakeツールチェーンファイルのパス>")
set(__qt_chainload_toolchain_file "${__qt_initially_configured_toolchain_file}")
if(NOT QT_QMAKE_TARGET_MKSPEC)
set(QT_QMAKE_TARGET_MKSPEC <Qt 5のクロスコンパイルで使用したRaspberry Pi向けデバイス定義ファイルのパス> CACHE STRING "")
endif()
if(NOT "${QT_CHAINLOAD_TOOLCHAIN_FILE}" STREQUAL "")
set(__qt_chainload_toolchain_file "${QT_CHAINLOAD_TOOLCHAIN_FILE}")
endif()
if(__qt_chainload_toolchain_file)
get_filename_component(__qt_chainload_toolchain_file_real_path
"${__qt_chainload_toolchain_file}" REALPATH)
if(__qt_chainload_toolchain_file_real_path STREQUAL CMAKE_CURRENT_LIST_FILE)
message(FATAL_ERROR
"Woah, the Qt toolchain file tried to include itself recursively! '${__qt_chainload_toolchain_file}' "
"Make sure to remove qtbase/CMakeCache.txt and reconfigure qtbase with 'cmake' "
"rather than 'qt-cmake', and then you can reconfigure your own project."
)
elseif(NOT EXISTS "${__qt_chainload_toolchain_file_real_path}")
message(WARNING "The toolchain file to be chainloaded "
"'${__qt_chainload_toolchain_file}' does not exist.")
else()
include("${__qt_chainload_toolchain_file}")
set(__qt_chainload_toolchain_file_included TRUE)
endif()
unset(__qt_chainload_toolchain_file)
endif()
get_filename_component(QT_TOOLCHAIN_RELOCATABLE_INSTALL_PREFIX ${CMAKE_CURRENT_LIST_DIR}/../../../ ABSOLUTE)
get_filename_component(QT_TOOLCHAIN_RELOCATABLE_CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE)
list(PREPEND CMAKE_PREFIX_PATH "${QT_TOOLCHAIN_RELOCATABLE_CMAKE_DIR}")
list(PREPEND CMAKE_FIND_ROOT_PATH "${QT_TOOLCHAIN_RELOCATABLE_INSTALL_PREFIX}")
if(NOT QT_AVOID_CUSTOM_PLATFORM_MODULES)
list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/platforms")
endif()
set(__qt_toolchain_additional_packages_prefixes "")
if(QT_ADDITIONAL_PACKAGES_PREFIX_PATH)
list(APPEND __qt_toolchain_additional_packages_prefixes ${QT_ADDITIONAL_PACKAGES_PREFIX_PATH})
endif()
if(DEFINED ENV{QT_ADDITIONAL_PACKAGES_PREFIX_PATH} AND NOT "$ENV{QT_ADDITIONAL_PACKAGES_PREFIX_PATH}" STREQUAL "")
set(__qt_env_additional_packages_prefixes $ENV{QT_ADDITIONAL_PACKAGES_PREFIX_PATH})
if(NOT CMAKE_HOST_WIN32)
string(REPLACE ":" ";" __qt_env_additional_packages_prefixes
"${__qt_env_additional_packages_prefixes}")
endif()
list(APPEND __qt_toolchain_additional_packages_prefixes ${__qt_env_additional_packages_prefixes})
unset(__qt_env_additional_packages_prefixes)
endif()
if(__qt_toolchain_additional_packages_prefixes)
set(__qt_toolchain_additional_packages_root_paths "")
set(__qt_toolchain_additional_packages_prefix_paths "")
foreach(__qt_additional_path IN LISTS __qt_toolchain_additional_packages_prefixes)
file(TO_CMAKE_PATH "${__qt_additional_path}" __qt_additional_path)
get_filename_component(__qt_additional_path "${__qt_additional_path}" ABSOLUTE)
set(__qt_additional_path_lib_cmake "${__qt_additional_path}")
if(NOT __qt_additional_path_lib_cmake MATCHES "/lib/cmake$")
string(APPEND __qt_additional_path_lib_cmake "/lib/cmake")
endif()
list(APPEND __qt_toolchain_additional_packages_root_paths "${__qt_additional_path}")
list(APPEND __qt_toolchain_additional_packages_prefix_paths "${__qt_additional_path_lib_cmake}")
endforeach()
list(PREPEND CMAKE_PREFIX_PATH ${__qt_toolchain_additional_packages_prefix_paths})
list(PREPEND CMAKE_FIND_ROOT_PATH ${__qt_toolchain_additional_packages_root_paths})
unset(__qt_additional_path)
unset(__qt_additional_path_lib_cmake)
unset(__qt_toolchain_additional_packages_root_paths)
unset(__qt_toolchain_additional_packages_prefix_paths)
endif()
unset(__qt_toolchain_additional_packages_prefixes)
set(__qt_toolchain_extra_file "${CMAKE_CURRENT_LIST_DIR}/qt.toolchain.extra.cmake")
if(EXISTS "${__qt_toolchain_extra_file}")
include("${__qt_toolchain_extra_file}")
endif()
if(QT_TOOLCHAIN_INCLUDE_FILE)
get_filename_component(__qt_toolchain_include_file_real_path "${QT_TOOLCHAIN_INCLUDE_FILE}" REALPATH)
if(EXISTS "${__qt_toolchain_include_file_real_path}")
include("${__qt_toolchain_include_file_real_path}")
else()
message(WARNING "The passed extra toolchain file to be included does not exist: " "${__qt_toolchain_include_file_real_path}")
endif()
endif()
if(DEFINED CACHE{CMAKE_BUILD_TYPE})
set(__qt_toolchain_cmake_build_type_before_project_call "${CMAKE_BUILD_TYPE}")
endif()
if(NOT "$ENV{_QT_TOOLCHAIN_VARS_INITIALIZED}")
set(ENV{_QT_TOOLCHAIN_VARS_INITIALIZED} ON)
foreach(var ${__qt_toolchain_used_variables})
set(ENV{_QT_TOOLCHAIN_${var}} "${${var}}")
endforeach()
endif()
ツールチェーンの設定
CLionを起動する。
[ファイル]メニューバー - [設定]を選択する。
[設定]画面の左ペインにある[ビルド、実行、デプロイ] - [ツールチェーン]を選択する。
[設定]画面の右ペインにある[+]アイコンを選択して、[システム]を選択する。
- ツールチェーンの設定項目
- [名前]
- 任意の名前を入力する。
- [CMake:]
- Raspberry Pi向けQtライブラリのビルドに使用したCMakeファイルのパスを入力する。
- [ビルドツール:]
- Raspberry Pi向けQtライブラリのビルドに使用したNinjaファイルのパスを入力する。
- [C コンパイラー:]
- Raspberry Pi向けQtライブラリのビルドに使用したGCCファイルのパスを入力する。
- 例: /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-gcc
- [C++ コンパイラー:]
- Raspberry Pi向けQtライブラリのビルドに使用したG++ファイルのパスを入力する。
- 例: /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-g++
- [デバッガー:]
- GCCツールチェーンのGDBファイルのパスを入力する。
- 例: /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-gdb
- [名前]
[設定]画面の右ペイン下部にある[適用]ボタンを押下する。
CMakeの設定
[ファイル]メニューバー - [設定]を選択する。
[設定]画面の左ペインにある[ビルド、実行、デプロイ] - [CMake]を選択する。
[設定]画面の右ペインにある[+]アイコンを選択する。
- CMakeの設定項目
- [名前]
- 任意の名前を入力する。
- [ビルドタイプ:]プルダウン
- [Debug]または[Release]を選択する。
- [ツールチェーン:]プルダウン
- 上記で設定したツールチェーン名を選択する。
- [ジェネレーター:]プルダウン
- [デフォルトを使用する]を選択する。
- 例: /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-gcc
- [環境:]
[環境:]のテキストアイコンを選択して、[環境設定]画面を開く。
画面右上の[+]ボタンを押下して、各環境変数を設定する。- CMAKE_C_COMPILER
- Raspberry Pi向けQtライブラリのビルドに使用したGCCファイルのパスを入力する。
- 例: /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-gcc
- CMAKE_CXX_COMPILER
- Raspberry Pi向けQtライブラリのビルドに使用したG++ファイルのパスを入力する。
- 例: /<GCCツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-g++
- CMAKE_PREFIX_PATH
- Raspberry Pi向けQtライブラリのインストールディレクトリのパスを入力する。
- 例: <Raspberry Pi向けQtライブラリのインストールディレクトリ>
- CMAKE_TOOLCHAIN_FILE
- Raspberry Pi向けQtライブラリのインストールディレクトリにあるビルド向けツールチェーンファイルのパスを入力する。
- 例: /<Raspberry Pi向けQtライブラリのインストールディレクトリ>/lib/cmake/Qt5/qt.toolchain.cmake
- QT_QMAKE_EXECUTABLE
- Raspberry Pi向けQtライブラリのインストールディレクトリにあるqmakeファイルのパスを入力する。
- 例: /<Raspberry Pi向けQtライブラリのインストールディレクトリ>/bin/qmake-host
- CMAKE_C_COMPILER
- [名前]
[設定]画面の右ペイン下部にある[適用]ボタンを押下する。
SSHの設定
[ファイル]メニューバー - [設定]を選択する。
[設定]画面の左ペインにある[ツール] - [SSH 構成]を選択する。
[設定]画面の右ペインにある[+]アイコンを選択する。
- SSH構成の設定項目
- [ホスト:]
- Raspberry PiのIPアドレスまたはホスト名を入力する。
- [ユーザー名:]
- Raspberry Piのユーザ名を入力する。
- [認証タイプ:]プルダウン
- [パスワード]または[キーペア]を選択する。
- [秘密鍵ファイル:] (キーペアを選択した場合)
- 秘密鍵ファイルのパスを入力する。
- [パスフレーズ:] (キーペアを選択した場合、かつ、パスフレーズを設定した場合)
- 秘密鍵のパスフレーズを入力する。
- [構成ファイル ~/.ssh/configの構文解析]チェックボックス
- 任意
- [ホスト:]
[接続テスト]ボタンを押下して、Raspberry PiにSSH接続する。
[設定]画面の右ペイン右下にある[適用]ボタンを押下する。
各プロジェクトの設定
CLionを起動して、[ファイル]メニューバー - [新規] - [プロジェクト...]を選択する。
[新規プロジェクト]画面から、[Qt Console 実行可能ファイル]または[Qt Widgets 実行可能ファイル]を選択する。
新規プロジェクトの作成後、[実行]メニューバー - [実行構成の編集...]を選択する。
[実行/デバッグ構成]画面が開くので、画面左上にある[+]ボタンを押下して、[リモート GDB サーバー]を選択する。
画面左ペインに[リモート GDB サーバー]が追加される。
画面左ペインに[リモート GDB サーバー]を選択して、各種設定を行う。
- [ターゲット:]プルダウン
- プロジェクト名を選択する。
- [実行可能ファイル:]プルダウン
- プロジェクト名を選択する。
- [GDB:]プルダウン
- 上記のツールチェーンの作成セクションで設定したGDBを選択する。
- [資格情報:]プルダウン
- 上記のSSHの設定セクションで設定したSSHを選択する。
- [実行可能ファイル...]ラジオボタン
- 任意
- [アップロードパス:]
- 実行可能バイナリが配置されるRaspberry Pi上のディレクトリを入力する。
- 例: /home/<Raspberry Piのユーザ名>/CLion/Sample1/debug
- ['target remote' ...]
- 自動的に入力される。
- 例: <IPアドレスまたはホスト名>:1234
- [GDB サーバー引数:]
- Qt WidgetsまたはQMLを使用するプロジェクトの場合、デバッグまたは実行時において、実行可能バイナリに
-platform wayland
オプションを付加する必要がある。 - 例:
:<GDBサーバのポート番号 例: 1234> /<実行可能バイナリが配置されるRaspberry Pi上のディレクトリ>/debug/<実行バイナリのファイル名> -platform wayland
- Qt WidgetsまたはQMLを使用するプロジェクトの場合、デバッグまたは実行時において、実行可能バイナリに
次に、[拡張 GDB サーバーオプション]項目を設定する。
この設定は、Raspberry PiにアップロードしたQtライブラリにおいて、デバッグまたは実行に関する設定を行う。
- [作業ディレクトリ:]
- 何も入力しない。
- [環境変数:]
[環境変数:]項目の右にあるテキストアイコンを選択する。
[環境変数]画面が開くので、画面左上にある[+]ボタンを押下して各種設定を入力する。- DISPLAY
- :0
- QT_QPA_PLATFORMTHEME
- Qt 5の場合 : qt5ct
- PATH
- Raspberry Pi上のQt5ライブラリをアップロードしたbinディレクトリのパスを入力する。
- 例: /<Qt5ライブラリをアップロードしたディレクトリ>/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
- LD_LIBRARY_PATH
- Raspberry Pi上のQt5ライブラリをアップロードしたlibディレクトリのパスを入力する。
- 例: /<Qt5ライブラリをアップロードしたディレクトリ>/lib:/<Qt5ライブラリをアップロードしたディレクトリ>/plugins/qmltooling
- QT_PLUGIN_PATH
- /<Qt5ライブラリをアップロードしたディレクトリ>/plugins
- QT_QPA_PLATFORM_PLUGIN_PATH
- /<Qt5ライブラリをアップロードしたディレクトリ>/plugins/platforms
- QML_IMPORT_PATH
- /<Qt5ライブラリをアップロードしたディレクトリ>/qml
- QML2_IMPORT_PATH
- /<Qt5ライブラリをアップロードしたディレクトリ>/qml
- QT_DEBUG_PLUGINS
- 0または1を入力する。
- LANG
- 日本語を設定する場合は、
ja_JP.UTF-8
と入力する。
- 日本語を設定する場合は、
- DISPLAY
また、[拡張 GDB サーバーオプション]項目の設定は、プロジェクトディレクトリ内の.idea/runConfigurations/<プロジェクト名>.xmlファイルに保存されている。
このファイルを直接編集することにより、上記の設定を行うこともできる。
CLion上で上記の設定を行うには煩雑なため、ファイルを直接編集することを推奨する。
cd <プロジェクトディレクトリ> vi .idea/runConfigurations/<プロジェクト名>.xml
<!-- .idea/runConfigurations/<プロジェクト名>.xml -->
<component name="ProjectRunConfigurationManager">
<configuration ...略>
<envs>
<env name="DISPLAY" value=":0" />
<env name="LANG" value="ja_JP.UTF-8" />
<env name="QML2_IMPORT_PATH" value="/<Qt5ライブラリをアップロードしたディレクトリ>/qml" />
<env name="QML_IMPORT_PATH" value="/<Qt5ライブラリをアップロードしたディレクトリ>/qml" />
<env name="QT_DEBUG_PLUGINS" value="0" />
<env name="QT_PLUGIN_PATH" value="/<Qt5ライブラリをアップロードしたディレクトリ>/plugins" />
<env name="QT_QPA_PLATFORM_PLUGIN_PATH" value="/<Qt5ライブラリをアップロードしたディレクトリ>/plugins/platforms" />
<env name="QT_QPA_PLATFORMTHEME" value="Qt5ct" />
<env name="LD_LIBRARY_PATH" value="/<Qt5ライブラリをアップロードしたディレクトリ>/lib:/<Qt5ライブラリをアップロードしたディレクトリ>/plugins/qmltooling" />
<env name="PATH" value="/<Qt5ライブラリをアップロードしたディレクトリ>/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" />
</envs>
<!-- ...略 -->
</configuration>
</component>
GDBの設定
プロジェクトにデバッグのためのより多くの設定が必要な場合、デバッガの初期化ファイル (GDBの場合は.gdbinit、LLDBの場合は.lldbinit) をプロジェクトディレクトリ直下に作成する。
このファイルは、他のプロジェクトと一緒にVCSで共有することもできる。
一般的に、GDB / LLDBは起動時に初期化ファイルを一定の順序で読み込む。
まず、デバッガはユーザのホームディレクトリにある初期化ファイルを探して、次に、現在のプロジェクトディレクトリ直下にある初期化ファイルを探す。
ただし、デフォルトの設定では、セキュリティ上の理由から、プロジェクト固有の初期化ファイルからのコマンドは実行されない。
そのため、ホームディレクトリの初期化ファイルである~/.gdbinitファイルまたは~/.lldbinitファイルを、以下に示すように編集する。
vi ~/.gdbinit または vi ~/.lldbinit
# ~/.gdbinitファイル または ~/.lldbinitファイル
set auto-load safe-path /
# または
set auto-load local-gdbinit on
add-auto-load-safe-path /
次に、プロジェクトディレクトリの直下に.gdbinitファイルを作成する。
cd <プロジェクトディレクトリ> vi .gdbinit または vi .lldbinit
# /<プロジェクトディレクトリ>/.gdbinitファイル または /<プロジェクトディレクトリ>/.lldbinitファイル
set sysroot <Raspberry Piのシステムルートディレクトリ>
CLionを起動して、任意のプロジェクトを開く。
CLionのメイン画面左にあるプロジェクトに.gdbinitファイル、または、.lldbinitファイルが追加されているかどうかを確認する。