インストール - Qt6 Banana Pi (RISC-V)
概要
RISC-Vが搭載されているBanana Piにおいて、一般的なデスクトップソフトウェアのクロスコンパイルおよび組み込み / デバイス作成のユースケースのクロスコンパイルを行う手順を記載する。
組み込み / デバイス作成とは、デスクトップソフトウェアをX11 / Waylandの下で実行するためのものではなく、EGLの上でフルスクリーンで実行するというユースケースのことである。
EGLを使用する場合、Qtソフトウェアはフルスクリーンでのみ動作する。
一般的なデスクトップウインドウで起動する場合はXCBを使用する必要があるが、XCBはOpenGLやQt Quickは動作しないことに注意すること。
このページでは、Banana PiにArmbian Trixieをインストールしていることを想定している。
| 参考書 | ||
|---|---|---|
![]() Introducing Qt 6 C++でモバイルとデスクトップ向けのアプリとゲームを作ることを学ぶ |
![]() Cross-Platform Development with Qt 6 and Modern C++ プラットフォーム依存性を気にすることなく、 モダンなグラフィカルユーザーインターフェースを持つアプリケーションを設計・構築する |
![]() A Guide to Qt 6 Qt 6の初心者向けガイド |
ホスト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
# QtWebEngineをインストールする場合
libicu-devel libopus-devel openjpeg2-devel pciutils-devel libpciaccess-devel libxshmfence-devel \
libvpx-devel python3-html5lib
# QtWebEngineをインストールする場合 (デフォルトパッケージ)
ffmpeg-4-libavcodec-devel ffmpeg-4-libavdevice-devel ffmpeg-4-libavfilter-devel ffmpeg-4-libavformat-devel \
ffmpeg-4-libavresample-devel ffmpeg-4-libavutil-devel ffmpeg-4-libpostproc-devel ffmpeg-4-libswresample-devel \
ffmpeg-4-libswscale-devel ffmpeg-4-private-devel
# QtWebEngineをインストールする場合 (Packmanパッケージ)
ffmpeg-6-libavcodec-devel ffmpeg-6-libavdevice-devel ffmpeg-6-libavfilter-devel ffmpeg-6-libavformat-devel \
ffmpeg-6-libavresample-devel ffmpeg-6-libavutil-devel ffmpeg-6-libpostproc-devel ffmpeg-6-libswresample-devel \
ffmpeg-6-libswscale-devel ffmpeg-6-private-devel
GCC RISC-V 64クロスツールチェーンにおいて、GCC 8以降が必要である。
GCC RISC-V 64クロスツールチェーンは提供されていないため、開発者が作成する必要がある。
開発者がGCC RISC-V 64クロスツールチェーンを作成する場合、インストール - GCC#クロスコンパイラ向けGCCツールチェーンのインストールを参照すること。
※注意
クロスコンパイラのlibstdc++.so.6ファイルにおいて、Armibianのlibstdc++.so.6ファイルのバージョンと同等または古いものを使用する必要がある。
例えば、Armbian Trixieのlibstdc++.so.6ファイルはGLIBCXX_3.4.36までであるため、GCC 15ツールチェーン、または、それ以前のものを使用する。
GCC RISC-V 64クロスツールチェーンは、システム固有のLTO(Link Time Optimization)フラグを使用して構築されているため、
ソフトウェアをコンパイルする時、これらのツールチェーンを使用することで、ArmbianのSoC固有の機能を簡単に利用することができる。
| Banana Piの種類 | LTO(Link Time Optimization)フラグ |
|---|---|
| Banana Pi F3 | -march=rv64gc -mabi=lp64d # ベクトル拡張含む、サポートされている場合 -march=rv64gcv -mabi=lp64d |
Banana Piの設定
/etc/apt/sources.listファイルのdeb-srcから始まる行のコメントを外す。
sudo vi /etc/apt/sources.list
# /etc/apt/sources.listファイル # Bullseyeの場合 ## 編集前 #deb-src http://deb.debian.org/debian unstable main contrib non-free non-free-firmware ## 編集後 deb-src http://deb.debian.org/debian unstable main contrib non-free non-free-firmware
Armbianのソフトウェアをアップデートする。
sudo apt update sudo apt upgrade sudo reboot
ArmbianにQtライブラリをインストールする。
build-depコマンドとは、ビルドに必要なパッケージが全てインストールするコマンドである。
ビルド設定によっては、不要なパッケージも含まれている。
- Armibian Trixie
## EGLを使用する場合
sudo apt install ccache libicu-dev icu-devtools libb2-dev 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 \
libpcre2-8-0 libpcre2-16-0 libpcre2-32-0 libpcre2-dev libsepol-dev libselinux1-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 libgles2-mesa-dev libgbm-dev
libgtk-3-dev # QtWidget向けにGTKネイティブテーマを使用する場合
## XCBを使用する場合
sudo apt install ccache libicu-dev icu-devtools libb2-dev 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 \
libpcre2-8-0 libpcre2-16-0 libpcre2-32-0 libpcre2-dev libsepol-dev libselinux1-dev libwacom-dev \
libfontconfig1-dev libdbus-1-dev libxkbcommon-dev libjpeg-dev libasound2-dev libudev-dev libgles2-mesa-dev \
libxcb-xinerama0 libxcb-xinerama0-dev libssl-dev libssl1.0-dev libnss3-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 libgles2-mesa-dev libgbm-dev
libgtk-3-dev # QtWidget向けにGTKネイティブテーマを使用する場合
# その他 sudo apt build-dep libqt6webengine-data # WebEngineを使用する場合
マルチメディア関連や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 gstreamer1.0-pulseaudio gstreamer1.0-tools gstreamer1.0-alsa libwayland-dev (Wayland開発パッケージは、gstreamerヘッダで必要) ※注意 libgstreamer-plugins-bad1.0-dev |
|
| ALSAオーディオ | libasound2-dev | |
| Pulseオーディオ | pulseaudio libpulse-dev | |
| OpenALオーディオ | libopenal-data libopenal1 libopenal-dev libsndio7.0 libsndio-dev | |
| FFmpeg |
|
|
| データベース | 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 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 |
ビルドしたQtソフトウェアをBanana Piにデプロイするためのディレクトリを作成する。
加えて、Qtライブラリを配置するディレクトリも作成する。
mkdir -p ~/InstallSoftware/QtApplication ~/InstallSoftware/Qt_6_x_x_EGL ~/InstallSoftware/Qt_6_x_x_XCB
次のセクションにおいて、rsyncコマンドを使用してLinux PCとBanana Piのファイルを同期する。
しかし、同期するファイルには、スーパユーザ権限が必要なものがある。
そのため、一般ユーザでも全てのファイルを同期できるように、/etc/sudoersファイルに以下の設定を追記する。
以下の設定により、rsyncコマンドは、必要に応じてスーパユーザ権限で実行される。
echo "$USER ALL=NOPASSWD:$(which rsync)" | sudo tee --append /etc/sudoers
システムルートディレクトリの設定
Linux PCで、Banana Pi向けのQtソフトウェアをクロスコンパイルできるように開発環境を設定する。
Banana Pi上でネイティブにコンパイルすることもできるが、Linux PCの方がスループットが良い。
Linux PC上に開発用ディレクトリを作成する。
また、Banana 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コマンドを使用して、Banana Piに存在するいくつかのディレクトリから、ファイルをダウンロードする。
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" \
<Banana Piのユーザ名>@<Banana Piのホスト名またはIPアドレス>:/lib \
<Banana Piのシステムルートディレクトリ>
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" \
<Banana Piのユーザ名>@<Banana Piのホスト名またはIPアドレス>:/usr/include \
/<Banana Piのシステムルートディレクトリ>/usr
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" \
<Banana Piのユーザ名>@<Banana Piのホスト名またはIPアドレス>:/usr/lib \
/<Banana Piのシステムルートディレクトリ>/usr
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" \
<Banana Piのユーザ名>@<Banana Piのホスト名またはIPアドレス>:/usr/share/pkgconfig \
/<Banana Piのシステムルートディレクトリ>/usr/share
ダウンロードしたファイルおよびディレクトリのシンボリックリンクを相対的に調整する。
fixQualifiedLibraryPathsが正常に動作しないため、提供されたスクリプトをダウンロードして実行する。
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py chmod +x sysroot-relativelinks.py ./sysroot-relativelinks.py <Banana Piのシステムルートディレクトリ>
Qtのソースコードのダウンロード
- Qt Everywhere (推奨)
- Qtの公式Webサイトにアクセスして、Qt 6のソースコードをダウンロードする。
wget https://download.qt.io/official_releases/qt/6.x/6.x.x/single/qt-everywhere-src-6.x.x.tar.xztar xf qt-everywhere-opensource-src-6.x.x.tar.gz
- Githubの使用
- GithubからQt 6のソースコードを個別にダウンロードする。
git clone https://github.com/qt/qt5.git qt6- ダウンロードしたスーパーリポジトリに移動する。
cd qt6git checkout <Qtのバージョン>- または
git checkout <Qtのショートバージョン>init-repositoryコマンドは、Qtが提供する指定したモジュールのソースコードを取得するためのツールである。- スーパーリポジトリは小さく、全てのモジュール(ライブラリ)はgit submodulesとして保持されている。
- 利用可能な全てのモジュールについてはこちらのWebサイト、ツールについては
init-repository --helpコマンドまたはこちらのWebサイトを参照すること。 ./init-repository --module-subset=essential,qtsvg,qtvirtualkeyboard,qtquickcontrols./init-repository -f --module-subset=qtquick3d,qtquicktimeline,qtwayland# 必要な場合は個別に追加ダウンロードする
- GithubからQt 6のソースコードを個別にダウンロードする。
デバイス定義ファイルの作成
EGLFSを使用する場合
qmake.confを作成する。
qmake.confファイルは、ビルド時の設定を定義するものである。
cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices mkdir linux-bananapi-g++ && cd linux-bananapi-g++ vi qmake.conf
# qmake.confファイル
include(../common/linux_device_pre.conf)
#QT_QPA_DEFAULT_PLATFORM = wayland
SYSROOT_INC = $$[QT_SYSROOT]/usr/include
SYSROOT_LIB = $$[QT_SYSROOT]/usr/lib
# Extra stuff (OpenGL, DirectFB, ...)
QMAKE_INCDIR_EGL = $$[SYSROOT_INC] \
$$[SYSROOT_INC]/riscv64-linux-gnu \
$$[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]/riscv64-linux-gnu
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}
# RISC-V64 ベクトル拡張1.0対応コンパイラフラグ
COMPILER_FLAGS = -march=rv64gcv -mabi=lp64d
QMAKE_CFLAGS = $${COMPILER_FLAGS}
QMAKE_CXXFLAGS = $${COMPILER_FLAGS}
# リリースビルド時の最適化フラグ
QMAKE_CXXFLAGS_RELEASE += -O2 -ftree-vectorize -pipe
QMAKE_LIBS += -lrt -lpthread -ldl
# Architecture specification
DISTRO_OPTS += riscv64
# for Debian-based distributions (Armbian)
DISTRO_OPTS += deb-multi-arch
# Preferred eglfs backend
EGLFS_DEVICE_INTEGRATION = eglfs_kms
include(../common/linux_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-bananapi-g++ && cd linux-bananapi-g++ vi qmake.conf
# qmake.confファイル
include(../common/linux_device_pre.conf)
# Use X11/XCB as default platform
QT_QPA_DEFAULT_PLATFORM = xcb
SYSROOT_INC = $$[QT_SYSROOT]/usr/include
SYSROOT_LIB = $$[QT_SYSROOT]/usr/lib
# X11/XCB includes and libraries
QMAKE_INCDIR_X11 = $$[SYSROOT_INC] \
$$[SYSROOT_INC]/riscv64-linux-gnu
QMAKE_LIBDIR_X11 = $$[SYSROOT_LIB] \
$$[SYSROOT_LIB]/riscv64-linux-gnu
QMAKE_LIBS_X11 = -lxcb -lxcb-shm -lxcb-render -lxcb-render-util \
-lxcb-shape -lxcb-randr -lxcb-xfixes -lxcb-sync \
-lxcb-image -lxcb-keysyms -lxcb-icccm \
-lX11 -lX11-xcb
# OpenGL (Desktop OpenGL with GLX, not OpenGL ES)
QMAKE_INCDIR_OPENGL = $$[SYSROOT_INC] \
$$[SYSROOT_INC]/riscv64-linux-gnu \
$$[SYSROOT_INC]/GL
QMAKE_LIBDIR_OPENGL = $$[SYSROOT_LIB] \
$$[SYSROOT_LIB]/riscv64-linux-gnu
QMAKE_LIBS_OPENGL = -lGL
# If using OpenGL ES2 with XCB (for embedded systems with X11)
# Uncomment these lines and comment out the Desktop OpenGL lines above:
#QMAKE_INCDIR_EGL = $$[SYSROOT_INC] \
# $$[SYSROOT_INC]/riscv64-linux-gnu \
# $$[SYSROOT_INC]/EGL \
# $$[SYSROOT_INC]/GLES2
#QMAKE_LIBDIR_EGL = $$[SYSROOT_LIB] \
# $$[SYSROOT_LIB]/riscv64-linux-gnu
#QMAKE_INCDIR_OPENGL_ES2 = $$[QMAKE_INCDIR_EGL]
#QMAKE_LIBDIR_OPENGL_ES2 = $$[QMAKE_LIBDIR_EGL]
#QMAKE_LIBS_EGL = -lEGL
#QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 $${QMAKE_LIBS_EGL}
# RISC-V64 ベクトル拡張1.0対応コンパイラフラグ
COMPILER_FLAGS = -march=rv64gcv -mabi=lp64d
QMAKE_CFLAGS = $${COMPILER_FLAGS}
QMAKE_CXXFLAGS = $${COMPILER_FLAGS}
# リリースビルド時の最適化フラグ
QMAKE_CXXFLAGS_RELEASE += -O2 -ftree-vectorize -pipe
QMAKE_LIBS += -lrt -lpthread -ldl
# Architecture specification
DISTRO_OPTS += riscv64
# for Debian-based distributions (Armbian)
DISTRO_OPTS += deb-multi-arch
include(../common/linux_device_post.conf)
load(qt_config)
次に、デバイス定義ファイルのヘッダファイルを作成する。
vi qplatformdefs.h
# qplatformdefs.hファイル
#include "../../linux-g++/qplatformdefs.h"
CMakeツールチェーンファイルの作成
Armbian Trixieの場合
vi ToolChain_for_Banana_Pi_F3.cmake
# ToolChain_for_Banana_Pi_F3.cmakeファイル
cmake_minimum_required(VERSION 3.18)
include_guard(GLOBAL)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR riscv64)
set(TARGET_SYSROOT "<Armibian Trixieのシステムルートディレクトリのパス>")
set(CMAKE_SYSROOT ${TARGET_SYSROOT})
set(ENV{PKG_CONFIG_PATH} $PKG_CONFIG_PATH:${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/lib/riscv64-linux-gnu/pkgconfig)
set(ENV{PKG_CONFIG_LIBDIR} /usr/lib64/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig/:${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/lib/riscv64-linux-gnu/pkgconfig:${TARGET_SYSROOT}/usr/share/pkgconfig)
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})
set(CMAKE_C_COMPILER /<RISC-V 64向けクロスコンパイラのインストールパス>/bin/riscv64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /<RISC-V 64向けクロスコンパイラのインストールパス>/bin/riscv64-linux-gnu-g++)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${TARGET_SYSROOT}/usr/include -I${TARGET_SYSROOT}/usr/include/riscv64-linux-gnu")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib/riscv64-linux-gnu")
set(CMAKE_MODULE_LINKER_FLAGS_INIT "-Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib/riscv64-linux-gnu")
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib/riscv64-linux-gnu")
# RISC-V64 ベクトル拡張対応コンパイラフラグ
set(QT_COMPILER_FLAGS "-march=rv64gcv -mabi=lp64d")
# リリースビルド用の最適化フラグ
set(QT_COMPILER_FLAGS_RELEASE "-O2 -pipe -ftree-vectorize")
# リンカフラグ
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/riscv64-linux-gnu/:${TARGET_SYSROOT}/usr:${TARGET_SYSROOT}/usr/lib)
set(EGL_INCLUDE_DIR ${GL_INC_DIR})
set(EGL_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/riscv64-linux-gnu/libEGL.so)
set(OPENGL_INCLUDE_DIR ${GL_INC_DIR})
set(OPENGL_opengl_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/riscv64-linux-gnu/libOpenGL.so)
set(GLESv2_INCLUDE_DIR ${GL_INC_DIR})
set(GLIB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/riscv64-linux-gnu/libGLESv2.so)
set(GLESv2_INCLUDE_DIR ${GL_INC_DIR})
set(GLESv2_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/riscv64-linux-gnu/libGLESv2.so)
set(gbm_INCLUDE_DIR ${GL_INC_DIR})
set(gbm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/riscv64-linux-gnu/libgbm.so)
set(Libdrm_INCLUDE_DIR ${GL_INC_DIR})
set(Libdrm_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/riscv64-linux-gnu/libdrm.so)
set(XCB_XCB_INCLUDE_DIR ${GL_INC_DIR})
set(XCB_XCB_LIBRARY ${XCB_PATH_VARIABLE}/usr/lib/riscv64-linux-gnu/libxcb.so)
Qtライブラリのクロスビルド
Qt 6をクロスビルドおよびインストールする。
# ビルドディレクトリを作成
mkdir /<Qtのソースコードがあるディレクトリ>/../build && cd /<Qtのソースコードがあるディレクトリ>/../build
export CROSS_PI_PATH=/<GCC RISC-V 64クロスツールチェインのインストールディレクトリ>
export CROSS_COMPILE=$CROSS_PI_PATH/bin/riscv64-linux-gnu-
# システムルードディレクトリの指定
export SYSTEMROOT=<Banana Pi OSのシステムルートディレクトリ>
export PKG_CONFIG_PATH=$SYSTEMROOT/usr/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$SYSTEMROOT/usr/lib/pkgconfig:$SYSTEMROOT/usr/share/pkgconfig
cmake -G Ninja \
<Qt 6のソースコードがあるディレクトリ> \
-DCMAKE_BUILD_TYPE=Release \
-DINPUT_opengl=es2 \
-DQT_FEATURE_opengles2=ON \
-DQT_FEATURE_opengles3=ON \
-DQT_FORCE_BUILD_TOOLS=ON \
-DCMAKE_TOOLCHAIN_FILE="$CROSSDIR/ToolChain_for_Banana_Pi_F3.cmake" \
-DQT_QMAKE_TARGET_MKSPEC=devices/linux-bananapi-f3-g++ \
-DQT_QMAKE_DEVICE_OPTIONS=CROSS_COMPILE=$CROSS_COMPILE \
-DQT_BUILD_EXAMPLES=OFF \
-DQT_BUILD_TESTS=OFF \
-DBUILD_qtopcua=OFF \
-DBUILD_qtquick3dphysics=OFF \ # PhysX物理エンジンがRISC-V64アーキテクチャを認識できないため無効
-DBUILD_qtdoc=OFF \ # QtDocをインストールしない場合
-DBUILD_qtwebengine=OFF \ # QtWebEngineをインストールしない場合
-DBUILD_qtwebview=OFF \ # QtWebViewをインストールしない場合
-DBUILD_qtwebchannel=OFF \ # QtWebChannelをインストールしない場合
-DFEATURE_clang=ON \ # QtDocをインストールする場合
-DFEATURE_clangcpp=ON \ # QtDocをインストールする場合
-DFEATURE_xcb_xlib=OFF \ # EGLFSを使用する場合
-DQT_FEATURE_xcb=OFF \ # EGLFSを使用する場合
-DQT_FEATURE_xlib=OFF \ # EGLFSを使用する場合
-DBUILD_WITH_PCH=ON \ # プリコンパイル済みのヘッダを無効化する場合
-DCMAKE_SYSROOT=$SYSROOT \
-DQT_HOST_PATH=<x86 64向けQt 6のパスのトップディレクトリ 例: /home/user/Qt/6.x.x/gcc_64> \
-DQT_HOST_PATH_CMAKE_DIR=/<x86 64向けQt 6のパスのcmakeディレクトリ 例: /home/user/Qt/6.x.x/gcc_64/lib/cmake> \
-DCMAKE_STAGING_PREFIX=<Banana Pi向けQt 6ライブラリを配置するディレクトリ> \
-DCMAKE_INSTALL_PREFIX=<Qtソフトウェアを配置するディレクトリ> \
-DCMAKE_PREFIX_PATH=$SYSROOT/usr/lib/riscv64-linux-gnu
# 共通
cmake --build . --parallel $(nproc) または cmake --build . --parallel $(nproc) > compile.txt 2>&1
cmake --install .
もし、Linux PCで使用するQtライブラリを配置するディレクトリにrccファイルが存在しない場合は、rccファイルをQtライブラリのbinディレクトリにコピーする。
これは、Qtライブラリを使用するプログラムをビルドする場合は、rccファイルが必要となるためである。
cp /<Qtのソースコードがあるディレクトリ>/qtbase/bin/rcc /<ホストPCで使用するQtライブラリを配置するディレクトリ>/bin
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メディアのサポートが追加される。 |
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 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を使用してビルドする。 |
Qt 6ライブラリのアップロード
ビルドしたQtライブラリを、Banana Piにデプロイする。
~/Program/Qt_Embedded/Qt6ディレクトリに存在する全てのファイルを、Banana Piの/usr/localディレクトリに同期させる。
rsync -avz --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" \ ~/Program/Qt_Embedded/Target <Banana Piのユーザ名>@<Banana Piのホスト名またはIPアドレス>:/home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x
※注意
Banana PiにアップロードしたQtライブラリの所有者がrootになっている場合があるため、
以下のコマンドを実行して、所有者をローカルユーザに変更する必要がある。
sudo chown -R <Banana Piのユーザ名>:<Banana Piのグループ名> ~/InstallSoftware/Qt_6_x_x
Banana PiのリンカがQtライブラリを読み込むようにするため、以下のコマンドを実行する。
/etc/ld.so.conf.dディレクトリに配置する場合、ファイル名の先頭に"00"を付加すること。
# .profileファイルに設定する場合 export LD_LIBRARY_PATH="/home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/lib:$LD_LIBRARY_PATH" # /etc/ld.so.conf.dディレクトリに配置する場合 echo /home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/lib | sudo tee /etc/ld.so.conf.d/00-Qt_6_x_x.conf sudo ldconfig
これにより、Banana PiでQtライブラリが使用できる。
Qt Creatorの設定
キットの設定
Qt Creatorを起動して、キットの設定を行う。
- QMakeの設定
- クロスコンパイルしたQt 6のインストールディレクトリに移動する。
- binディレクトリにあるhost-qmakeファイルのシンボリックファイル(ここでは、qmake-hostファイルとする)を作成する。
ln -s host-qmake qmake-host
- キットの作成
- [編集] - [設定]を選択して、[設定]画面を開く。
- [設定]画面左にある[キット] - [設定]画面右の[Qtバージョン]タブから[追加]ボタンを押下する。
- 上記で作成したシンボリックファイルを選択する。
- [設定]画面左にある[キット] - [設定]画面右の[キット]タブから[追加]ボタンを押下する。
- [デバイスの種類]プルダウンから、[Remote Linux Device]を選択する。
- [デバイス]プルダウンから、[設定]画面左にある[デバイス]で作成したターゲットを選択する。
- [ビルドデバイス]プルダウンから、[ローカルPC]を選択する。
- [Sysroot]項目に、Banana Piのシステムルートディレクトリのパスを入力する。
- [コンパイラ]項目の[C]プルダウンから、C向けのクロスコンパイラを選択する。
- [コンパイラ]項目の[C++]プルダウンから、C++向けのクロスコンパイラを選択する。
- [GDB]プルダウンから、クロスコンパイラ向けGDBを選択する。
- [Qtバージョン]プルダウンから、上記で設定した[Qtバージョン]を選択する。
- [Qt mkspec]項目から、デバイス定義ファイル (/<クロスコンパイルしたQt 6のインストールディレクトリ>/mkspecs/devices/linux-bananapi-f3-g++ファイル) のパスを入力する。
- [CMake Tool]プルダウンから、クロスコンパイルで使用したCMakeを選択する。
- [CMakeの設定]項目の[変更...]ボタンを押下して、
-DCMAKE_TOOLCHAIN_FILE:UNINITIALIZED=/<クロスコンパイルしたQt 6のインストールディレクトリ>/lib/cmake/Qt6/qt.toolchain.cmakeと入力する。- [適用]ボタンを押下する。
- ただし、この設定は、Qt Creatorの左サイド画面にある[プロジェクト] - [キット名] - [ビルド]を選択して、
- Qt Creatorメイン画面右ペインの[ビルド設定]にある
CMAKE_TOOLCHAIN_FILEの値を編集することにより、プロジェクトごとに設定することができる。
Qtプロジェクトの設定
次に、Qt Creatorでソフトウェアを開発する時の環境設定を行う。
まず、プロジェクトの環境変数の設定を行う。
Qt Creatorを起動して、Qt Creatorメイン画面左の[プロジェクト] - 左ペインの[Run] - 右ペインの[ビルド設定] - [Environment]項目 - [詳細]プルダウンを開く。
[詳細]プルダウンから[追加]ボタンを押下して、以下の項目を設定する。
Qtプロジェクトをデバッグする場合は、必ず[デバイス環境の取得]ボタンを押下すること。
- Variable - QT_QPA_PLATFORMTHEME
- Value - qt6ct
- Variable - DISPLAY
- Value - :0 または :0.0
- Variable : PATH
- Value : /home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/bin ※PATHの設定が既に存在する場合は、追記する
- Variable : LD_LIBRARY_PATH (Banana Piの~/.profileファイルに環境変数LD_LIBRARY_PATHを設定している場合)
- Value : /home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/lib:/home/<Banana Pi's User Name>/InstallSoftware/Qt_6_x_x/plugins/qmltooling
- Variable : QML_IMPORT_PATH
- Value : /home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/qml
- Variable : QML2_IMPORT_PATH
- Value : /home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/qml
- Variable : QT_PLUGIN_PATH
- Value : /home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/plugins
- Variable : QT_QPA_PLATFORM_PLUGIN_PATH
- Value : /home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/plugins/platforms
また、上記の設定を簡潔に行う場合、Qtプロジェクトのディレクトリにある.pro.userファイルにおいて、
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">〜</valuemap>要素内に、以下の設定を追記する。
以下の設定を追記する場合、必ず、Qtプロジェクトを閉じた状態で行うこと。
# .pro.userファイル
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<!-- ...略 -->
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes">
<value type="QString">QT_QPA_PLATFORMTHEME=qt6ct</value>
<value type="QString">DISPLAY=:0</value>
<value type="QString">PATH=/home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games</value>
<value type="QString">LD_LIBRARY_PATH=/home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/lib:/home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/plugins/qmltooling</value>
<value type="QString">QML_IMPORT_PATH=/home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/qml</value>
<value type="QString">QML2_IMPORT_PATH=/home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/qml</value>
<value type="QString">QT_PLUGIN_PATH=/home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/plugins</value>
<value type="QString">QT_QPA_PLATFORM_PLUGIN_PATH=/home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x/plugins/platforms</value>
</valuelist>
<!-- ...略 -->
</valuemap>
もし、デバッグにおいて、以下のようなエラーが出力される場合は、
Qt Creatorのサイドメニューから、[プロジェクト] - [Build & Run] - [Run] - [コマンドライン引数:]項目に、-platform waylandを記述する。
# エラー内容 Failed to create wl_display (No such file or directory) ... error: XDG_RUNTIME_DIR not set in the environment ... qt.qpa.plugin: Could not load the Qt platform plugin "wayland"
GDBの設定
次に、GDBデバッガの設定を行う。
リモートターゲットをデバッグする時、GDBは、Linux PC側にダウンロードしているBanana Piのシステムルートディレクトリを検索する。
そのため、GDBにターゲット側のBanana Piのシステムルートディレクトリを検索するように設定する必要がある。
これは、Qt Creatorメイン画面から、[ツール]メニューバー - [オプション] - [デバッガ] - [GDB]タブ - [追加の起動コマンド]に、以下の内容を設定する。
ただし、この設定はQt Quickを使用する時のみである。(Qt Widgetを使用する場合は設定不要)
set sysroot target:/
しかし、上記の[追加の起動コマンド]において、set sysroot target:/オプションを使用する場合、デバッグの開始に時間が掛かる。
そのため、以下のように、[追加の起動コマンド]を記述して、
システムルートディレクトリに対して、Qtライブラリのインストールディレクトリのシンボリックリンクを作成することを推奨する。
システムルートディレクトリに対して、Linux PCに保存したBanana Pi向けのQtライブラリがあるディレクトリのシンボクリックリンクを作成する。
mkdir -p /<Banana Piのシステムルートディレクトリ>/home/<Banana Piのユーザ名>/InstallSoftware ln -s /<Qtライブラリのインストールディレクトリ> /<Banana Piのシステムルートディレクトリ>/home/<Banana Piのユーザ名>/InstallSoftware # シンボリックリンク名の変更 mv /<Banana Piのシステムルートディレクトリ>/home/<Banana Piのユーザ名>/InstallSoftware/<Qtライブラリのインストールディレクトリ> \ /<Banana Piのシステムルートディレクトリ>/home/<Banana Piのユーザ名>/InstallSoftware/Qt_6_x_x
Qt Creatorメイン画面から、[ツール]メニューバー - [オプション] - [デバッガ] - [GDB]タブ - [追加の起動コマンド]に、以下の内容を設定する。
# Kit名に"BananaPi"という文字列が入っている場合のみ、Banana Piのシステムルートディレクトリを参照する
# x86 / x64のKitを使用する場合は、Banana Piのシステムルートディレクトリを参照しない
[ -n $(grep -i BananaPi %{ActiveProject:Kit:Name}) ] && set sysroot /<Banana Piのシステムルートディレクトリ>
# または
set sysroot /<Banana Piのシステムルートディレクトリ>
これにより、Banana PiでQtライブラリが使用できる。
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ライブラリをBanana Piにデプロイする。
rsync -avz --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" /<Qtライブラリを配置するディレクトリ> \
<Banana Piのユーザ名>@<Banana Piのホスト名またはIPアドレス>:/home/<Banana Piのユーザ名>/<Qtライブラリをインストールするディレクトリ>
ビルドエラー関連
ビルドエラー : GCC 13を使用する場合
GCC 13を使用してQt 6をビルドする場合、以下に示すようなエラーが出力される場合がある。
バグレポートURL : https://bugreports.qt.io/browse/QTBUG-111604?focusedCommentId=718489
# エラー出力 1 error: 'uint32_t' is not a member of 'std'; did you mean 'wint_t'? # エラー出力 2 error: 'FeatureType' does not name a type; did you mean 'ToFeatureType'?
この時、以下に示すファイルを編集する。
// qt-everywhere-src-6.x.x/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cppファイル
// 53行目
// 変更前
#include <stdint.h>
// 変更後
#include <cstdint>
// qt-everywhere-src-6.x.x/qtquick3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cppファイル
// 53行目
// 変更前
#include <stdint.h>
// 変更後
#include <cstdint>
// qt-everywhere-src-6.x.x/qtquick3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXTokenizer.cppファイル
// 58行目
// 変更前
#include <stdint.h>
// 変更後
#include <cstdint>
ビルドエラー : X Keyboardに関するエラー
コンパイル時において、以下に示すようなエラーが出力される場合がある。
error: XKB_KEY_dead_lowline was not declared in this scope; did you mean XKB_KEY_dead_belowring? または error: 'XKB_KEY_dead_lowline' was not declared in this scope; did you mean 'XKB_KEY_dead_belowring'?
この時、cmakeコマンドの実行時において、-DFEATURE_xkbcommon=OFFオプションを付加する。
ビルドエラー関連 : Qt Toolのqhelpgeneratorに関するエラー
cmakeコマンドの実行時において、以下に示すようなエラーが出力される場合がある。
-- Configuring submodule 'qttools' CMake Error at qttools/src/assistant/qhelpgenerator/CMakeLists.txt:66 (add_dependencies): Cannot add target-level dependencies to non-existent target "qhelpgenerator". The add_dependencies works for top-level logical targets created by the add_executable, add_library, or add_custom_target commands. If you want to add file-level dependencies see the DEPENDS option of the add_custom_target and add_custom_command commands.
この時、以下に示すファイルを編集する。
これにより、ターゲットが存在する場合のみ依存関係を追加するようになる。
vi /<Qt 6のソースコードがあるディレクトリ>/qttools/src/assistant/qhelpgenerator/CMakeLists.txt
# /<Qt 6のソースコードがあるディレクトリ>/qttools/src/assistant/qhelpgenerator/CMakeLists.txtファイル 66行目
# 編集前
else() # QT_BUILD_SHARED_LIBS
if(QT_SUPERBUILD)
add_dependencies(qhelpgenerator ${needed_plugins})
endif()
endif()
# 編集後
else() # QT_BUILD_SHARED_LIBS
if(QT_SUPERBUILD)
if(TARGET qhelpgenerator)
add_dependencies(qhelpgenerator ${needed_plugins})
endif()
endif()
endif()
ビルドエラー : Qt Toolのqhelpgeneratorに関するエラー
ビルド時において、以下に示すようなエラーが出力される場合がある。
error: 'google::protobuf::FileDescriptor::Syntax google::protobuf::FileDescriptor::syntax() const'
この時、以下に示すcmakeコマンドのオプションを付加する。
cmake -G Ninja \ # ...略 -DBUILD_qtgrpc # ...略
ビルドエラー : libQt6DBusに関するエラー
以下に示すようなエラーが発生する場合がある。
libQt6DBus.so.6: undefined reference to `QtPrivate::QPropertyBindingData::notifyObserver_helper(QUntypedPropertyData*, QBindingStorage*, QPropertyObserverPointer, QVarLengthArray<QBindingObserverPtr, 256ll>&) const@Qt_6`
システムルート内の既存のQt6ライブラリを一時的に隔離する。
これにより、ビルドプロセスが誤ったライブラリを参照することを防ぐ。
システムルートのライブラリディレクトリ内のQt6関連の共有ライブラリファイルを別のディレクトリに移動させる。
cd /<Banana Piのシステムルート>/usr/lib/aarch64-linux-gnu mkdir -p Qt6_Backup mv libQt6*.so* Qt6_Backup/
これにより、クロスコンパイル時に古いQt 6ライブラリが誤ってリンクされることを防ぐ。
ビルドエラー : Waylandに関するエラー
Qt 6をビルドする場合、以下に示すようなエラーが出力される場合がある。
wayland-fullscreen-shell-unstable-v1-client-protocol.h:XXX:Y: error: 'wl_proxy_marshal_flags' was not declared in this scope; did you mean 'wl_proxy_marshal_array'? wayland-fullscreen-shell-unstable-v1-client-protocol.h:XXX:Y: error wl_proxy_marshal_flags was not declared in this scope; did you mean wl_proxy_marshal_array?
このエラーは、ターゲットデバイスにインストールされているWaylandライブラリのバージョンが古いため発生する。
例えば、Qt 6.5をビルドする場合は、Wayland 1.19以降が必要となる。
そのため、ターゲットデバイスのOSをアップグレード、あるいは、Waylandライブラリをソースコードからインストールする必要がある。
Qt Creatorに関するエラー
Qt Creator 14のリモートデバッグに関するエラー
Qt Creator 14 および GDBを使用してリモートデバッグを実行する時、以下に示すようなメッセージが表示された後、デバッガがハングする場合がある。
使用可能なポートを確認中... xx:yy:zz: Found 101 free ports. xx:yy:zz: /usr/bin/gdbserver --multi :10000 on <ターゲットデバイス名> を起動中... xx:yy:zz: Debugging ssh://<ユーザ名>@<ホスト名>/<デプロイ先>/<実行ファイル名> ... xx:yy:zz: Debugging of ssh://<ユーザ名>@<ホスト名>/<デプロイ先>/<実行ファイル名> has finished.
Listening on port 10000
この時、Qt Creator 14は使用せずに、Qt Creator 13以前を使用する必要がある。
ロケールに関する警告
デバッグ開始時において、以下に示す警告が表示される場合がある。
Detected locale "C" with character encoding "ANSI_X3.4-1968", which is not UTF-8. Qt depends on a UTF-8 locale, and has switched to "C.UTF-8" instead. If this causes problems, reconfigure your locale. See the locale(1) manual for more information.
この警告は、Raspberry Pi側のロケール設定がUTF-8ではないため、Qtが自動的にロケールを切り替えていることを示している。
Qt Creatorのデバッグ設定において、環境変数を明示的に設定する。
- [プロジェクト]を開いて、Qt Creatorのメイン画面左ペインにある[プロジェクト] - 該当するキット内にある[実行]を選択する。
- 次に、[環境]セクションの[詳細]ボタンを押下して、以下に示す設定を追加する。
LANG=C.UTF-8 LC_ALL=C.UTF-8
CLion / Qt 6との連携
ツールチェーンの設定
CLionを起動する。
[ファイル]メニューバー - [設定]を選択する。
[設定]画面の左ペインにある[ビルド、実行、デプロイ] - [ツールチェーン]を選択する。
[設定]画面の右ペインにある[+]アイコンを選択して、[システム]を選択する。
- ツールチェーンの設定項目
- [名前]
- 任意の名前を入力する。
- [CMake:]
- Banana Pi向けQtライブラリのビルドに使用したCMakeファイルのパスを入力する。
- [ビルドツール:]
- Banana Pi向けQtライブラリのビルドに使用したNinjaファイルのパスを入力する。
- [C コンパイラー:]
- Banana Pi向けQtライブラリのビルドに使用したGCCファイルのパスを入力する。
- 例: /<GCCツールチェーンのインストールディレクトリ>/bin/riscv64-linux-gnu-gcc
- [C++ コンパイラー:]
- Banana Pi向けQtライブラリのビルドに使用したG++ファイルのパスを入力する。
- 例: /<GCCツールチェーンのインストールディレクトリ>/bin/riscv64-linux-gnu-g++
- [デバッガー:]
- GCCツールチェーンのGDBファイルのパスを入力する。
- 例: /<GCCツールチェーンのインストールディレクトリ>/bin/riscv64-linux-gnu-gdb
- [名前]
[設定]画面の右ペイン下部にある[適用]ボタンを押下する。
CMakeの設定
[ファイル]メニューバー - [設定]を選択する。
[設定]画面の左ペインにある[ビルド、実行、デプロイ] - [CMake]を選択する。
[設定]画面の右ペインにある[+]アイコンを選択する。
- CMakeの設定項目
- [名前]
- 任意の名前を入力する。
- [ビルドタイプ:]プルダウン
- [Debug]または[Release]を選択する。
- [ツールチェーン:]プルダウン
- 上記で設定したツールチェーン名を選択する。
- [ジェネレーター:]プルダウン
- [デフォルトを使用する]を選択する。
- 例: /<GCCツールチェーンのインストールディレクトリ>/bin/riscv64-linux-gnu-gcc
- [環境:]
[環境:]のテキストアイコンを選択して、[環境設定]画面を開く。
画面右上の[+]ボタンを押下して、各環境変数を設定する。- CMAKE_C_COMPILER
- Banana Pi向けQtライブラリのビルドに使用したGCCファイルのパスを入力する。
- 例: /<GCCツールチェーンのインストールディレクトリ>/bin/riscv64-linux-gnu-gcc
- CMAKE_CXX_COMPILER
- Banana Pi向けQtライブラリのビルドに使用したG++ファイルのパスを入力する。
- 例: /<GCCツールチェーンのインストールディレクトリ>/bin/riscv64-linux-gnu-g++
- CMAKE_PREFIX_PATH
- Banana Pi向けQtライブラリのインストールディレクトリのパスを入力する。
- 例: <Banana Pi向けQtライブラリのインストールディレクトリ>
- CMAKE_TOOLCHAIN_FILE
- Banana Pi向けQtライブラリのインストールディレクトリにあるビルド向けツールチェーンファイルのパスを入力する。
- 例: /<Banana Pi向けQtライブラリのインストールディレクトリ>/lib/cmake/Qt6/qt.toolchain.cmake
- QT_QMAKE_EXECUTABLE
- Banana Pi向けQtライブラリのインストールディレクトリにあるqmakeファイルのパスを入力する。
- 例: /<Banana Pi向けQtライブラリのインストールディレクトリ>/bin/qmake-host
- CMAKE_C_COMPILER
- [名前]
[設定]画面の右ペイン下部にある[適用]ボタンを押下する。
SSHの設定
[ファイル]メニューバー - [設定]を選択する。
[設定]画面の左ペインにある[ツール] - [SSH 構成]を選択する。
[設定]画面の右ペインにある[+]アイコンを選択する。
- SSH構成の設定項目
- [ホスト:]
- Banana PiのIPアドレスまたはホスト名を入力する。
- [ユーザー名:]
- Banana Piのユーザ名を入力する。
- [認証タイプ:]プルダウン
- [パスワード]または[キーペア]を選択する。
- [秘密鍵ファイル:] (キーペアを選択した場合)
- 秘密鍵ファイルのパスを入力する。
- [パスフレーズ:] (キーペアを選択した場合、かつ、パスフレーズを設定した場合)
- 秘密鍵のパスフレーズを入力する。
- [構成ファイル ~/.ssh/configの構文解析]チェックボックス
- 任意
- [ホスト:]
[接続テスト]ボタンを押下して、Banana PiにSSH接続する。
[設定]画面の右ペイン右下にある[適用]ボタンを押下する。
各プロジェクトの設定
CLionを起動して、[ファイル]メニューバー - [新規] - [プロジェクト...]を選択する。
[新規プロジェクト]画面から、[Qt Console 実行可能ファイル]または[Qt Widgets 実行可能ファイル]を選択する。
新規プロジェクトの作成後、[実行]メニューバー - [実行構成の編集...]を選択する。
[実行/デバッグ構成]画面が開くので、画面左上にある[+]ボタンを押下して、[リモート GDB サーバー]を選択する。
画面左ペインに[リモート GDB サーバー]が追加される。
画面左ペインに[リモート GDB サーバー]を選択して、各種設定を行う。
- [ターゲット:]プルダウン
- プロジェクト名を選択する。
- [実行可能ファイル:]プルダウン
- プロジェクト名を選択する。
- [GDB:]プルダウン
- 上記のツールチェーンの作成セクションで設定したGDBを選択する。
- [資格情報:]プルダウン
- 上記のSSHの設定セクションで設定したSSHを選択する。
- [実行可能ファイル...]ラジオボタン
- 任意
- [アップロードパス:]
- 実行可能バイナリが配置されるBanana Pi上のディレクトリを入力する。
- 例: /home/<Banana Piのユーザ名>/CLion/Sample1/debug
- ['target remote' ...]
- 自動的に入力される。
- 例: <IPアドレスまたはホスト名>:1234
- [GDB サーバー引数:]
- Qt WidgetsまたはQMLを使用するプロジェクトの場合、デバッグまたは実行時において、実行可能バイナリに
-platform waylandオプションを付加する必要がある。 - 例:
:<GDBサーバのポート番号 例: 1234> /<実行可能バイナリが配置されるBanana Pi上のディレクトリ>/debug/<実行バイナリのファイル名> -platform wayland
- Qt WidgetsまたはQMLを使用するプロジェクトの場合、デバッグまたは実行時において、実行可能バイナリに
次に、[拡張 GDB サーバーオプション]項目を設定する。
この設定は、Banana PiにアップロードしたQtライブラリにおいて、デバッグまたは実行に関する設定を行う。
- [作業ディレクトリ:]
- 何も入力しない。
- [環境変数:]
[環境変数:]項目の右にあるテキストアイコンを選択する。
[環境変数]画面が開くので、画面左上にある[+]ボタンを押下して各種設定を入力する。- DISPLAY
- :0
- QT_QPA_PLATFORMTHEME
- Qt 6の場合 : Qt6ct
- PATH
- Banana Pi上のQt6ライブラリをアップロードしたbinディレクトリのパスを入力する。
- 例: /<Qt6ライブラリをアップロードしたディレクトリ>/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
- LD_LIBRARY_PATH
- Banana Pi上のQt6ライブラリをアップロードしたlibディレクトリのパスを入力する。
- 例: /<Qt6ライブラリをアップロードしたディレクトリ>/lib:/<Qt6ライブラリをアップロードしたディレクトリ>/plugins/qmltooling
- QT_PLUGIN_PATH
- /<Qt6ライブラリをアップロードしたディレクトリ>/plugins
- QT_QPA_PLATFORM_PLUGIN_PATH
- /<Qt6ライブラリをアップロードしたディレクトリ>/plugins/platforms
- QML_IMPORT_PATH
- /<Qt6ライブラリをアップロードしたディレクトリ>/qml
- QML2_IMPORT_PATH
- /<Qt6ライブラリをアップロードしたディレクトリ>/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="/<Qt6ライブラリをアップロードしたディレクトリ>/qml" />
<env name="QML_IMPORT_PATH" value="/<Qt6ライブラリをアップロードしたディレクトリ>/qml" />
<env name="QT_DEBUG_PLUGINS" value="0" />
<env name="QT_PLUGIN_PATH" value="/<Qt6ライブラリをアップロードしたディレクトリ>/plugins" />
<env name="QT_QPA_PLATFORM_PLUGIN_PATH" value="/<Qt6ライブラリをアップロードしたディレクトリ>/plugins/platforms" />
<env name="QT_QPA_PLATFORMTHEME" value="Qt6ct" />
<env name="LD_LIBRARY_PATH" value="/<Qt6ライブラリをアップロードしたディレクトリ>/lib:/<Qt6ライブラリをアップロードしたディレクトリ>/plugins/qmltooling" />
<env name="PATH" value="/<Qt6ライブラリをアップロードしたディレクトリ>/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 <Banana Piのシステムルートディレクトリ>
CLionを起動して、任意のプロジェクトを開く。
CLionのメイン画面左にあるプロジェクトに.gdbinitファイル、または、.lldbinitファイルが追加されているかどうかを確認する。


