前回は準備を行いました。
続けて Qt6 のビルドとサンプルの動作確認を行います。
クロス開発環境構築の手順(再掲)
- RaspberryPi 側の準備 (→ 【準備編】)
- OS イメージ作成と起動
- Qt の開発に必要なパッケージの導入
- 環境設定
- Windows 側の準備
- Qt 開発環境の導入
- クロスコンパイラを導入
- sysroot のコピー
- CMake と Ninja-build を実行できるようにする
- pkg-config の導入と設定
- CMake 用の設定ファイル作成
- Qt のビルド (→ この記事はここから)
- ソースコード取得
- configure
- ビルドとインストール
- RPi へのコピー
- QtCreator の設定
- リモートデバイスの設定
- Qt キットの設定
- サンプルの動作確認
- 補足 (→ 【補足編】)
- クロス開発環境を別の WinPC へ持ち込みたい
- RPi側実行環境の OS イメージを小さくしたい
- X Window アプリを作れるようにしたい
- 32bit のクロス環境を作りたい
- まだできていないこと
Qt のビルド
いよいよ Qt6 をビルドしていきます。
CLI での操作が中心になりますがガンバりましょう。
Linux でやったことがある方はここからはそれとほぼ同じ手順です。
ソースコード取得
git で Qt6 のソースコードを取得します。
ここだけ MinGW64 のコマンドラインではなく、git bash で行います。
Qt の MinGW64 には init-repository で使う perl が含まれていません。
user@host MINGW64 ~
$ cd /c/Qt/qt6build
user@host MINGW64 /c/Qt/qt6build
$ git clone "https://codereview.qt-project.org/qt/qt5"
user@host MINGW64 /c/Qt/qt6build
$ cd qt5
user@host MINGW64 /c/Qt/qt6build/qt5 (dev)
$ git checkout 6.5.1
Switched to a new branch '6.5.1'
branch '6.5.1' set up to track 'origin/6.5.1'.
user@host MINGW64 /c/Qt/qt6build/qt5 (6.5.1)
$ ./init-repository -f --module-subset=qtbase,qtdeclarative,qtquick3d,qtshadertools,qtsvg
configure
MinGW64 のコマンドラインで実行します。
sysroot の内容から RPi OS 上のどんな機能が使えてどれが使えないかなどが検査され、ビルドするための準備が完了します。
C:\Qt\6.5.1\mingw_64> cd C:\Qt\qt6build
C:\Qt\qt6build> mkdir build
C:\Qt\qt6build> cd build
C:\Qt\qt6build\build> ..\qt5\configure -release -no-pch -no-xcb -opengl es2 -qpa eglfs \
-nomake examples -nomake tests -qt-host-path C:/Qt/6.5.1/mingw_64 \
-extprefix C:/Qt/qt6-rpi -prefix /opt/qt -device linux-rasp-pi3-g++ \
-device-option CROSS_COMPILE=aarch64-linux-gnu- -- \
-DCMAKE_TOOLCHAIN_FILE=C:/Qt/qt6build/toolchain.cmake
オプション設定のポイントは以下の通り
- -no-pch
- これをつけないとビルドが途中でコケます
- -no-xcb
- X Window 対応を除外
- -qpa eglfs
- QPA (Qt の描画システム) のデフォルトプラグインの指定
- EGLFS (Xorg/X11 を使わず OpenGL/EGL で直接描画) を選択
- この指定は環境変数(QT_QPA_PLATFORM)や実行時引数(-platform)で上書きできます
- QPA (Qt の描画システム) のデフォルトプラグインの指定
- -qt-host-path
- Windows 側で動作する Qt の環境を教えておきます
- -extprefix
- クロス環境 (Windows 側)のインストール先
- -prefix
- RPi 側のインストール先
- -device
- Raspberry Pi 3 用の設定を指定
- ソースコードの qtbase/mkspecs/devices/ 以下にいろいろあります
- -DCMAKE_TOOLCHAIN_FILE
- CMake に toolchain.cmake を指定
ビルドとインストール
ビルド&インストールしましょう。
C:\Qt\qt6build\build> cmake --build . --parallel
C:\Qt\qt6build\build> cmake --install .
C:\Qt\qt6-rpi\
以下に RPi 向け Qt6.5.1 がインストールされます。
RPi へのコピー
C:\Qt\qt6-rpi\
以下の内容を RPi にコピーします。
コピー先は configure で指定した /opt/qt/
以下です。
## Windows 側からコピー(WinSCPなどでやってもOK)
C:\Qt\qt6build\build> scp -r C:\Qt\qt6-rpi\* pi@raspberrypi.local:/opt/qt/
QtCreator の設定
クロス開発環境ができたはずなので使ってみましょう
QtCreator を起動して設定を行います。
リモートデバイスの設定
まずは QtCreator が RPi へアクセスできるように設定しましょう。
RPi を起動しネットワークに接続しておき、ssh でログインできることを確認しておくといいでしょう。
QtCreator で、
- 編集 → Preferences → デバイスを選択します。
- Add → Remote Linux Device → ウイザード開始
- 設定名、ホスト名(or IPアドレス)、ログインユーザ名を設定
- 設定名にはわかりやすい名前をつけておきましょう
- ホスト名 と ログインユーザ名は RPi のものを指定します
- Create New Key Pair → Generate And Save Key Pair → Deploy Public Key
- すでに鍵ペアがあるなら公開鍵ファイルを指定して Deploy Public Key
- 次へ → 完了、でテストが開始されます。
テストは rsync でエラーが起きますが sftp が使われますので問題ありません。
「デバイステストが成功しました」と表示されたら OK です。
Qt キットの設定
クロスコンパイラの登録
QtCreatorで、
- 編集 → Preferences → キット → コンパイラ タブを選択します。
- 追加 → GCC → C を選択
- コンパイラのパスで 編集 →
C:\SysGCC\raspberry64\bin\aarch64-linux-gnu-gcc.exe
を選択 - 名前 を適宜変更
- コンパイラのパスで 編集 →
- 追加 → GCC → C++ を選択
- コンパイラのパスで 編集 →
C:\SysGCC\raspberry64\bin\aarch64-linux-gnu-g++.exe
を選択 - 名前 を適宜変更
- コンパイラのパスで 編集 →
- 適用 を選択
クロスビルドした Qt 自身の登録
QtCreatorで、
- 編集 → Preferences → キット → Qt バージョン タブを選択します。
- 追加 を選択して、
C:\Qt\qt6-rpi\bin\qmake.bat
を選択 - 適用 を選択
GDB の登録
デバッガまわり、動作未確認です
QtCreatorで、
- 編集 → Preferences → キット → デバッガ タブを選択します。
- 追加 を選択
- パスで参照 →
C:\SysGCC\raspberry64\bin\aarch64-linux-gnu-gdb.exe
を選択 - 名前 を適宜変更
- パスで参照 →
- 適用 を選択
Qt kit の登録
QtCreatorで、
- 編集 → Preferences → キット → キット タブを選択します。
- 追加 を選択
- 名前 を設定します。RPi 向けの Qt6 だとわかりやすい名前がいいでしょう
- デバイスの種類 → Remote Linux Device を指定
- デバイス で先ほど設定したリモートデバイスを選択
- Sysroot に SysGCC 配下に置いた sysroot ディレクトリを指定
C:\SysGCC\raspberry64\aarch64-linux-gnu\sysroot
- コンパイラ を指定します
- C に登録した C コンパイラを設定
- C++ に登録した C++ コンパイラを設定
- デバッガ に登録した GDB を設定
- Qtバージョンに登録した Qtバージョンを選択
- 最下段 CMake 設定 で 変更 を選択
- 最下行に以下2行を追記
-DCMAKE_TOOLCHAIN_FILE:UNINITIALIZED=C:/Qt/qt6-rpi/lib/cmake/Qt6/qt.toolchain.cmake -DCMAKE_INSTALL_PREFIX:UNINITIALIZED=/home/pi
- OK を選択
- OK を選択
これで、Qt のプロジェクトを作成するときに RPi 向けの設定が選べるようになります。
サンプルの動作確認
qtquick3d のサンプル picking を例に動かしてみます。
- QtCreator のサンプルから picking を選ぶ
- プロジェクト設定で、作成した RPi 向けの configuration を選ぶ
- ビルド&実行
- CMAKE_INSTALL_PREFIX に指定されている
/home/pi
以下にデプロイされます
- CMAKE_INSTALL_PREFIX に指定されている
どうでしょうか、うごきましたか?
以上でクロス開発環境が揃いました。
次は補足編です。