C言語でprintfと書いたらどのOSでもちゃんと文字が出ますが、ウインドウを出すとなるとそうは行きません。それぞれ用意されているAPIが違うからです。QtはLinuxやMacなどそれぞれの場合のウインドウ描画などのプログラムが入っていて、Qtを使ってプログラムを書けばどのOSでも同じプログラムで同じようなウインドウを表示するGUIのアプリを作ることが出来ます。

Qtのサイト( http://www.qt.io )
Screen Shot 2015-09-18 at 08.22.21

当然、QtはRaspberryPiでも使うことが出来ます。
Qtは普通コンパイル済みのライブラリとして配られていてはWindowsやMacなどはインストーラーで入れられるのですが、RaspberryPiなどのCPUがARM系のものはライブラリが配布されていないので(だいぶ前のバージョンならある)自分でQtのプログラムを持ってきてARM向けにコンパイルする必要があります。そしてコンパイルしたライブラリと連携する自分のソフトをかけばGUIのアプリが作れます。
ただ、プログラムの量が多く、コンパイルにRaspberryPiB+でも2日程度かかってしまいます。そこで、CPUが4個も入っているRaspberryPi2でやってみましょう!僕の場合は5時間ちょいぐらいでコンパイルできました。

Qtのサイトに載っていますのでそれを参考に進めます。この記事を書いたタイミングはQt5.5でした。
https://wiki.qt.io/Native_Build_of_Qt5_on_a_Raspberry_Pi
https://wiki.qt.io/Native_Build_of_Qt_5.4.1_on_a_Raspberry_Pi

1. 必要な物を用意する

[shell]
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libfontconfig1-dev libdbus-1-dev libfreetype6-dev libudev-dev libicu-dev libsqlite3-dev
sudo apt-get install libxslt1-dev libssl-dev libasound2-dev libavcodec-dev libavformat-dev libswscale-dev libgstreamer0.10-dev
sudo apt-get install libgstreamer-plugins-base0.10-dev gstreamer-tools gstreamer0.10-plugins-good gstreamer0.10-plugins-bad
sudo apt-get install libraspberrypi-dev libpulse-dev libx11-dev libglib2.0-dev libcups2-dev freetds-dev libsqlite0-dev libpq-dev
sudo apt-get install libiodbc2-dev libmysqlclient-dev firebird-dev libpng12-dev libjpeg62-dev libgst-dev libxext-dev libxcb1 libxcb1-dev
sudo apt-get install libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0
sudo apt-get install libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync0 libxcb-sync0-dev libxcb-render-util0
sudo apt-get install libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev
sudo apt-get install libxi-dev libdrm-dev
[/shell]

ここで、大本のサイトは1つのapt-getでライブラリを入れるようになっていますが、多すぎてうまくコピペ出来なかったので1行ごとに分割して行いました。
(コピペに失敗するとこうなる
E: Unable to locate package libsqlite3-dev libxslt1-dev
E: Unable to locate package libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
E: Couldn’t find any package by regex ‘libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev’
E: Unable to locate package gstreamer0.10-plugins-bad libraspberrypi-dev
E: Couldn’t find any package by regex ‘gstreamer0.10-plugins-bad libraspberrypi-dev’
E: Unable to locate package libpq-dev libiodbc2-dev
E: Unable to locate package libxcb1-dev libx11-xcb1
E: Unable to locate package libxcb-shm0 libxcb-shm0-dev
E: Unable to locate package libxcb-render-util0 libxcb-render-util0-dev
E: Unable to locate package libxcb-glx0-dev libxi-dev
)

2. プログラムを持ってくる

適当なディレクトリ(今回はホーム)に移動してソースコードを持ってきます。

[shell]
cd ~
sudo apt-get install git
git clone git://code.qt.io/qt/qt5.git
[/shell]

そして、必要な依存ファイルを持ってきます。./init-repositoryは20分ぐらいかかります。

[shell]
cd qt5
./init-repository
[/shell]

3. 設定を変更する

コンパイル前にいくつか変更しておかなければならないものがあります。
まず、./qtbase/configureを編集します。

[shell]
sudo nano ./qtbase/configure
[/shell]

800行目ぐらいにあるQT_CFLAGS_DBUS~QT_LIBS_GLIBあたりをこのようにします

[shell]
# flags for libdbus-1
QT_CFLAGS_DBUS="-I/usr/include/dbus-1.0/ -I/usr/lib/arm-linux-gnueabihf/dbus-1.0/include/"
QT_LIBS_DBUS=-ldbus-1

# flags for Glib (X11 only)
QT_CFLAGS_GLIB="-I/usr/include/glib-2.0/ -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include/"
QT_LIBS_GLIB=-lglib-2.0
[/shell]

そしてその下にこれらを新しく追加します。

[shell]
QT_CFLAGS_PULSEAUDIO="-I/usr/include/glib-2.0/ -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include/"
QT_LIBS_PULSEAUDIO="-lpulse -lpulse-mainloop-glib"

QT_CFLAGS_GSTREAMER="-I/usr/include/gstreamer-0.10/ -I/usr/include/glib-2.0/ -I/usr/lib/arm-linux-
gnueabihf/glib-2.0/include/ -I/usr/include/libxml2/"
QT_LIBS_GSTREAMER=
[/shell]

あと、それよりしたのQT_CFLAGS_FONTCONFIGに関する部分を編集します。

[shell]
if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG –exists fontconfig –exists freetype2 2>/dev/null; then
QT_CFLAGS_FONTCONFIG=`$PKG_CONFIG –cflags fontconfig –cflags freetype2 2>/dev/null`
QT_LIBS_FONTCONFIG=`$PKG_CONFIG –libs fontconfig –libs freetype2 2>/dev/null`
else
QT_CFLAGS_FONTCONFIG=
QT_LIBS_FONTCONFIG="-lfreetype -lfontconfig"
fi
[/shell]

となっているところがあるかとおもいますが、
QT_CFLAGS_FONTCONFIG=

QT_CFLAGS_FONTCONFIG=-I/usr/include/freetype2/
にします。

[shell]
if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG –exists fontconfig –exists freetype2 2>/dev/null; then
QT_CFLAGS_FONTCONFIG=`$PKG_CONFIG –cflags fontconfig –cflags freetype2 2>/dev/null`
QT_LIBS_FONTCONFIG=`$PKG_CONFIG –libs fontconfig –libs freetype2 2>/dev/null`
else
QT_CFLAGS_FONTCONFIG=-I/usr/include/freetype2/
QT_LIBS_FONTCONFIG="-lfreetype -lfontconfig"
fi
[/shell]

こんな感じにね。
そして、できたら保存してconfigします。これもちょっと時間がかかります。

[shell]
./configure -v -opengl es2 -device linux-rasp-pi-g”+ -device-option CROSS_COMPILE=/usr/bin/ -opensource -confirm-license -optimized-qmake -reduce-exports -release -qt-pcre -make libs -prefix /usr/local/qt5 &> output
[/shell]

出力ファイルを指定しているので、consoleには何も出てこないと思いますが安心して下しあ。何か問題があればエラーは表示されます。
また、結果を確認したい場合は outputファイルを開いてみてみてください。

4. コンパイル

コンパイルは5時間と31分かかりました。電源が切れないことを確認してください。また、sshから実行するとsshを5時間閉じれなくなるのでraspberryPi上からやるとよいでしょう。

[shell]
make -j 4 &> output_make
[/shell]

今回も出力ファイルを output_makeにしましたので完了するまで何も出てこないです。
-j 4は並列に4つ作業するという意味で、CPUが4つなので4としました。
エラーがなく完了していれば安心です。試しにtail output_makeでみてみると最後の3行は

[shell]
make[3]: Leaving directory ‘/home/pi/projects/qt5/qt3d/tools/qgltf’
make[2]: Leaving directory ‘/home/pi/projects/qt5/qt3d/tools’
make[1]: Leaving directory ‘/home/pi/projects/qt5/qt3d’
[/shell]

こんな感じになっていました。
それでは、コンパイルが終わったので必要なヘッダやライブラリを共有スペースにコピーしましょう。

[shell]
sudo make install
[/shell]

5. 環境変数に追加する

環境変数にqtの場所を教えましょう。
環境変数をbashrcに入れます(bash_profileに入れるというのもあります)

[shell]
nano ~/.bashrc
[/shell]

ファイルの最後に以下を追加します。

[shell]
export LD_LIBRARY_PATH=/uer/local/qt5/lib/
export PATH=/usr/local/qt5/bin:$PATH
[/shell]

そしたら、source ~/.bashrcでリロードするか sudo shutdown -r nowやsudo rebootで再起動しちゃいましょう。
これでQtのコンパイルは完了です!

6. 一回試してみる。

サンプルのプログラムがQtに入ってますから、ちょっと試してみましょう。
まずgitでもってきたqtのなかのサンプルディレクトリを開きます

[shell]
cd ~/qt5/qtbase/examples/opengl/cube
[/shell]

そしたらqmake(さっきコンパイルして作成されたQt用アプリの事前makeみたいなもの)とmakeをして実行します。

[shell]
qmake
make
./cube
[/shell]

画面にサイコロが出てきてマウスなどで動かすことができたら成功です!

2015-09-14 12.09.20

ちなみにHDMIでなく、こういう外部ディスプレイでQtを(openGLをつかったものを)表示する場合はFBCBを使う必要があります。それは次回扱います。

Categories: RaspberryPi

2 Comments

ふんふん · 2016/02/05 at 09:50

非常に参考になりました、ありがとうございます。

私の環境では”&”が”&amp”, “>”が”&gt”というふうに見えていますが、これは私の環境だけでしょうか。

    yuki sato · 2016/02/08 at 22:01

    wordpressの編集画面が勝手に変換したみたいです。。。
    修正しますね!ありがとうございます。

yuki sato にコメントする コメントをキャンセル