Raspberry PiのQtライブラリをUbuntuでクロスコンパイルする方法

Cross compiling Qt Raspbian on Ubuntu desktop(2019)
Raspberry PiはストレージがSDカードという特性上、多くのファイルが作成されるC言語によるアプリ開発をしようとすると、コンパイルにわりかし時間がかかってしまいます。アプリを動かすのとは異なるパソコンでプログラムをコンパイルする手法はクロスコンパイルと呼ばれており、SSD搭載などの最新の環境でプログラムをビルドすることができれば、格段に開発効率が上がります。今回はLinuxディストリビューションのひとつであるUbuntuを使って、ラズベリーパイのアプリを開発・リモートデバッグする方法をご紹介します。

基本的な流れは、稼働中のRaspberry Piからarm用プログラムライブラリーをデスクトップパソコンで動かしているUbuntuにコピーして、それらをもとにQtのオリジナルソースをコンパイルすることとなります。Windowsでも同様のことはできなくもないのですが、Linuxに比べて環境構築の難易度が相当高いので、Windowsユーザーは仮想マシンのLinuxで行いましょう。

まずはRaspbian側でarmライブラリーをダウンロードします。余計なライブラリー情報がない、新規インストールしたRaspbianで行うのがいいでしょう。

「/etc/apt/sources.list」ファイル内にある3行目の行頭にある「#」を削除したものを上書き保存し、ダウンロードソースの追加を指示します。
テキストの更新後は「apt-get update」を実行する必要があります。
sudo apt-get update sudo apt-get upgrade sudo rpi-update reboot
ちなみに、最新のWindows 10にはSSHクライアントが標準で含まれており、このサービスを有効にすることで、Windows PowerShellからRaspbianのターミナルを操作することができます。パワーシェルよりアクセスするには「ssh [ユーザー名]@[接続先アドレス]」を入力します。
sudo apt-get build-dep qt5-default sudo apt-get install qtdeclarative5-dev libts-dev
ビルド後のライブラリーを保存するディレクトリを作成します。
sudo mkdir /usr/local/qt5pi sudo chown -R pi:pi /usr/local/qt5pi
Ubuntu側の設定に移ります。Ubuntuのターミナルを起動したら開発ツール一式をインストールします。
sudo apt-get install gcc git bison python gperf pkg-config gdb-multiarch
作業用ディレクトリーを作成します。
sudo mkdir /opt/qt5pi sudo chown 1000:1000 /opt/qt5pi
ラズベリーパイ用のツールチェインをGithubよりダウンロードします。
git clone https://github.com/raspberrypi/tools
このツールチェインのディレクトリーをシステムに登録します。「~/.bashrc」ファイルを開いて、次の一文を追加しましょう。
export PATH=$PATH:/opt/qt5pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
Ubuntuを再起動してパスを有効にしたら、Qtのソースコードをダウンロードし、アーカイブファイルを展開します。現時点の最新版はVer 5.11ですが、5.9がLTS(より長い期間メンテナンスされるバージョン)として提供されています(2018年11月末に公開予定のVer 5.12はLTS)。
cd /opt/qt5pi wget //download.qt.io/official_releases/qt/5.11/5.11.2/single/qt-everywhere-src-5.11.2.tar.xz tar xf qt-everywhere-src-5.11.2.tar.xz
Qtのメイクプリセットには「浮動小数点演算をサポートしたARM Linux(linux-arm-gnueabihf)」のプロファイルが用意されていないので、「linux-arm-gnueabi」をベースに、自分でこのプロファイルを作りましょう。このコマンドラインでは、「mkspecs」にある「linux-arm-gnueabi」フォルダーをコピーして、中にあるテキストを「arm-linux-gnueabihf」に置換する作業を行っています。
cp -R qt-everywhere-src-5.11.2/qtbase/mkspecs/linux-arm-gnueabi-g++ qt-everywhere-src-5.11.2/qtbase/mkspecs/linux-arm-gnueabihf-g++ sed -i -e 's/arm-linux-gnueabi-/arm-linux-gnueabihf-/g' qt-everywhere-src-5.11.2/qtbase/mkspecs/linux-arm-gnueabihf-g++/qmake.conf
Rasbianを動かしている本体から、ライブラリー一式をUbuntuへコピーします。接続がうまくいかないようなら、「raspberrypi.local」の箇所をRaspberry Piの保有するローカルIPアドレスに置き換えてください。
mkdir sysroot sysroot/usr sysroot/opt rsync -avz pi@raspberrypi.local:/lib sysroot rsync -avz pi@raspberrypi.local:/usr/include sysroot/usr rsync -avz pi@raspberrypi.local:/usr/lib sysroot/usr rsync -avz pi@raspberrypi.local:/opt/vc sysroot/opt
Raspberry Piのファイルをそのまま持ってきただけでは、ライブラリーのシンボリックリンクに問題が残るので、以下のコマンドでそれらのリンクを修正します。
mv sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0_backup mv sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0_backup ln -s sysroot/opt/vc/lib/libEGL.so sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 ln -s sysroot/opt/vc/lib/libGLESv2.so sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 ln -s sysroot/opt/vc/lib/libEGL.so sysroot/opt/vc/lib/libEGL.so.1 ln -s sysroot/opt/vc/lib/libGLESv2.so sysroot/opt/vc/lib/libGLESv2.so.2 wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py chmod +x sysroot-relativelinks.py ./sysroot-relativelinks.py sysroot
ソースコードのビルドに移ります。現在のディレクトリが「/opt/qt5pi/」であることを確認し、Configureツールを実行します。赤文字の箇所を「linux-rasp-pi2-g++」「linux-rasp-pi3-g++」に差し替えると、それぞれの機器に最適化されたコンパイルオプションが付与されます。この例では、ウェブブラウザエンジンなどのコンパイルに時間がかかったり、使用頻度の少ないライブラリーをskipオプションで省略しています。ターミナルへのコピー&ペーストだとたまに認識されないことがあるので注意。
../qt-everywhere-src-5.11.2/configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=arm-linux-gnueabihf- -sysroot /opt/qt5pi/sysroot -prefix /usr/local/qt5pi -opensource -confirm-license -skip qtwebengine -skip qtscript -skip qtlocation -skip qtserialbus -nomake examples -make libs
makeによるビルドを始める際、「j」オプションを付けると、ビルドに同時使用するCPUのコア数を変更することができます。たとえば、「-j4」とすると、4つのコアがつかわれるため、適切なCPU(と適切な仮想マシン設定)であれば、オプションを付けない場合に比べて理論上は4倍速になります。
make -j4 make install
ビルドとインストールが完了したら、それらのファイルをラズベリーパイへコピーします。
cd /opt/qt5pi rsync -avz sysroot/usr/local/qt5pi pi@raspberrypi.local:/usr/local
UbuntuのQt Creatorでアプリを開発する方法は次回にて。
2018/11/09