この記事は
Qt Advent Calendar 2016の11日目として書かれました。
当初のタイトルと内容が一致していなかったため、新しく変更しました。
Buildrootとはなんぞや?というのはこちらの記事に書きました。
この記事ではパソコンではなく、ラズパイのような組み込みデバイス上で動くQtアプリケーションの作成とデバッグする環境のセットアップの仕方を述べたいと思います。
ターゲットボードにarmv7命令セットのCubox-iというのを使います。
Buildrootとは 紹介と使い方の入門
大まかな作業内容
- ツールチェインとqmakeを生成
- rootfsを作成とネットワークのセットアップ
- Qtアプリケーションを作成
- リモートデプロイとリモートデバッグ
Buildrootのセットアップ
Buildrootそのものは先の記事でダウンロード済みとします。
今回はターゲットボードにCubox-iを使いますので次のようにdefconfigをロードしてあげます。
make mx6cubox_defconfig
ロードしたら少しQtアプリケーション向けに編集します。
make menuconfig を実行して次の通りにチェックボックスを入れていきます。
Buildrootというか依存関係の部分で、事前に必要なところをONにしてないと、ONにできないのです。
Toolchain --->
[*] Enable WCHAR support
[*] Thread library debugging
[*] Enable C++ support
[*] Build cross gdb for the host
Target packages --->
Debugging, profiling and benchmark --->
[*] gdb
[*] Python support
Libraries --->
Graphic libraries and applications (graphic/text) --->
[*] Qt --->
[*] Approve free license
Networking applications --->
[*] openssh
次にツールチェインとqmakeのセットアップをします。
make qt-install を実行します。
普通のQtだと途中でコンシューマライセンスかオープンソースライセンスか聞かれてしまうのですが、
Buildrootのconfigで”Approve free license”としているので、オープンソースライセンスとしてビルドされます。
QtCreatorのキットを組み立てる
完了したら、さっそくQtCreatorにキットをセットアップしてみましょう。
キットを組み立てる(日本語化してる時は適宜読み替えてください)
QtCreator を起動する
メニューバー Tools -> Options を開く。
Devicesを開いて、Add をクリックする。
ダミーデバイスを作る。GenecricLinuxDeviceを選択してウイザードを進める。名前は"cubox"、他の項目は適当にダミーデータを入れて次に進む。
Build & Run を選択
Qt Versions タブを開いて、Add をクリックする。
ダイアログが開くので"qmakeのビルド"で作成されたqmakeを選択する。Version nameに"Qt %{Qt:Version} (buildroot)"とつける。
Compilers タブを開いて Add -> GCC をクリックする。
Nameに"buildroot_armhf", Compiler pathに"buildroot.git/output/host/usr/bin/arm-linux-g++" を選択する。他の欄は何もしなくて良い。
Debuggers タブを開いて、Add をクリックする。
Nameに"buildroot_gdb", Compiler pathに"buildroot.git/output/host/usr/bin/arm-linux-gdb" を選択する。
Kits タブを開いて、Add をクリックする。
Nameにbuildroot, DeviceTypeに"GenericLinuxDevice", Deviceに"cubox",Sysrootはブランク(空),Compilerに"先ほど作ったbuildrootと書いてあるものを",Debuggerに"そのまま", QtVersionに"Qt(buildroot)", Qtmkspecはブランク(空),CmakeToolはブランク(空)
(ここに写真を入れる)
これでキットの作成は完了です。
rootfsを作成する
さて、先ほどの手順ではQtしかビルドしてないので残りの部分も全部ビルドします、
make と実行して放置します。
完了すると成果物がoutput/imagesの下に落ちています。
ここでは dd if=output/images/sdcard.img of=/dev/sdX としてSDカードに転送しました。
サイズはU-boot,kernel,rootfs含めて26MBほどでした。
転送したらcuboxにつけて、シリアルコンソールでログインできることを確認しましょう。
アカウントはrootでパスワードは空っぽで入れます。
シリアルコンソールは私はこんな感じでやりました。
cu -l /dev/ttyUSB0 -s 115200n8
ログインできたら、リモートデプロイできるようにネットワークとOpenSSHの設定を少ししておきます。
- ターゲットのネットワークを設定する
/etc/network/interfaces に書き足して、ifup eth0とかします。 auto eth0 iface eth0 inet static address 192.168.12.150 netmask 255.255.255.0
- ターゲットのsshdの設定をする
/etc/ssh/sshd_config を編集します PermitRootLogin yes PasswordAuthentication yes PermitEmptyPasswords yes
これでターゲットとSSHできる環境が整ったはずです。
予めコンソールでssh root@192.168.12.150 などをして無事に繋がることを確認してみましょう。
パスワードを設定しろ。と言われてしまったらしてください。空だと私はうまくいきませんでした。
Qtアプリケーションを作成する
新しいプロジェクトを開いて、
Qtコンソールアプリケーションを選択してセットアップします。
先ほどセットアップしたキットを選択しましょう!
とりあえず、アプリケーションはHelloWorldとすることにしました。
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTextStream out(stdout);
out << "hello Qt world" << endl;
out << "hello Qt world2" << endl;
return a.exec();
}
少しプロジェクトファイルを変更します。
networkモジュールがいらないのでマイナスしておきます。
QT -= gui network
リモートデバッグするべく、インストールパスを書き足しておきます。
http://doc.qt.io/qtcreator/creator-deployment-embedded-linux.html
target.path = /root
INSTALLS = target
QtCreatorのキットのデバイスを再設定して右にあるテストをやってみましょう。
ホストに接続中...
カーネルバージョンの確認中...
Linux 4.7.3 armv7l
指定されたポートが使用可能か確認中...
すべての指定されたポートが使用可能です。
デバイステストが成功しました。
などと表示されればばっちりです。
リモートデプロイとデバッグ
さてここまで来たらアプリケーションをデプロイ&実行です!
緑の再生ボタンを押してやってみてください。
ちゃんと出てきましたか? 停止ボタンを押してアプリを一旦閉じましょう。
out << "hello Qt world" << endl; の行の数字を右クリックしてブレークポイントに設定をしましょう。
そして、虫付きの緑の再生ボタンを実行してみてください。
どうですか?
まとめ
まず、Buildrootを使って必要なrootfsの生成の他にビルド環境をセットアップしました。
これには、ビルド環境にはコンパイラ、デバッガ、qmakeが含まれます。
生成されたビルド環境を使ってQtCreatorのキットを作成しました。
ハローワールドなサンプルアプリを作成しました。
ターゲットボードにOpenSSHの設定を行ってリモートデバッグできる環境を構築しました。
QtCreatorでリモートデプロイ、実行、デバッグを行いました。
一般的にクロスコンパイラやデバッグ環境を整えるのはめんどくさい作業です。
BuildrootとQtCreatorのキットを使うことでシンプルで理解のしやすい環境を構築できることを示しました。