qgmap 開発メモ – 設定ファイルとかスレッドとか

あ、ザウルスでGoogleMapですが、勝手に qgmap と名付けました。とりあえず。

一応地図は表示できるようになったものの、地図データのパスを指定したり、パスを設定ファイルに保存したりしなくちゃいけない。

zaurus 内を覗いてみると、~/Settings に設定ファイルが集まっているようだ。設定ファイルのフォーマットは Windows の INI ファイルみたいに、

[セクション名]
アイテム名 = 設定値

といったフォーマットになってる。これって各アプリ自前でパースしてんのかな?? 結構手間だなぁ。

なんて思いながらググっていると、Configというクラスを使えば簡単に読み書きできることが分かった。(→参考ページ

なるほど、簡単にアクセスできるクラスがあるんだね。ちなみに、Qt3 では QSettings というクラスでできるようだ。これらを#ifdef で切り替えれば x86 でも zaurus でも動くように作れそう。

あと Qtopia-1.6 のリファレンス も発見。zaurus では Qtopia-1.5 らしいけど、Trolltechのページには1.5は見つからなかった。まぁこれで十分。

軽くクラス一覧を見てみると、QThread が無いらしい。これもググってみると、zaurus では QThread は使えないので pthread を使えと書いてある。(→参考ページ)

地図スクロール時の引っかかるような感じは、地図画像の読み込&拡大処理が終わるまで表示が待たされるために起こるので、これらの処理を別スレッドで動かそうかと思ってたんだけどなぁ。ちょっと面倒らしい。シングルスレッドでできる方法も考えてみるか。

ubuntu で Qt/E 開発 その2

昨日の続きです。

4. x86環境の構築

昨日の冒頭でも書きましたが、gcc-4.x では x86上で Qt/E アプリをデバッグするためのシミュレータ(?)環境である qvfb 用のバイナリが、コンパイルできませんでした。

おそらく、gcc-2.9x の環境を作ればコンパイルできるのでしょうが、ちょっと手間なので、別の方向で逃げることにしました。

それは、Qt3アプリとして作ってしまうことです。

zaurusのQt2とQt3は上位互換ですが、Qt4からは互換性がないらしいので、Qt 3アプリとしてホスト上である程度作ってしまい、Qt/E用にビルドするときは一部のクラスをQt/E用のクラスに入れ替える方法を取りました。

Qt 環境と Qt/E 環境は細かい所は違うのかもしれませんが、Qt の QApplication を QPEApplication に置き換えれば大体は動くようです。というか、QApplication と QPEApplication を入れ替えれば動くように作ります。

最終段階では qvfb が使えた方がいいのでしょうが、それはその時に考えることにします。あっかんべー

ということで Qt3の環境を整えます。

どれから入れたかは忘れてしまいましたが、今現在Qt3 関係で入っているパッケージは以下のとおりです。

  • libqt3-compat-headers
  • libqt3-headers
  • libqt3-i18n
  • libqt3-mt
  • libqt3-mt-dev
  • qt3-apps-dev
  • qt3-designer
  • qt3-dev-tools
  • qt3-dev-tools-compat
  • qt3-dev-tools-embedded
  • qt3-doc
  • qt3-examples

aptでいくつかインストールすれば依存関係でほとんどインストールされてしまうと思います。

これでQt3アプリをビルドする環境が整いました。

5. x86(Qt3), ARM(Qt/E) 共通のソースで開発

Qt3 と Qt/E ではコンパイラもMakefileも異なるので、プロジェクトファイル (*.pro ファイル) を分けることで切り替えます。

例えば、hoge というディレクトリにソース一式が入っており、 hoge というアプリを作るとします。

このとき、Qt3 用には、

$ qmake-qt3 -project
$ qmake-qt3
$ make

で プロジェクトファイル hoge.pro、メイクファイル Makefile を作成し、ビルドします。

ARM環境では、プロジェクトファイルの作成に progen、Makefile の作成に tmakeを使います。

$ progen -o hoge-arm.pro
$ tmake -o Makefile.arm hoge-arm.pro
$ make -f Makefile.arm

これでプロジェクトファイル hoge-arm.pro、メイクファイル Makefile.arm が作成され、ビルド時には make に -f オプションを指定することで、Makefile.arm を使ってビルドします。

実際には、progen で作成した pro ファイルに、

DESTDIR = ./
INCLUDEPATH += $(QTDIR)/library
DEPENDPATH += $(QTDIR)/library
TARGET = hoge
LIBS += -lqpe

を追加する必要がありますが、流れは上記の通りです。

QApplication と QPEApplication は #ifdef で切り替えます。

Qt/E用のビルドでは QWS が define されるようなので、#ifdef QWS で Qt/E と Qt3 を判断します。

こんな感じで

#ifdef QWS
#include <qpe/qpeapplication.h>
#else
#include <qapplication.h>
#endif
#include "gmap.h"
int main(int argc, char **argv)
{
#ifdef QWS
QPEApplication app(argc, argv);
GMap *win = new GMap();
app.showMainWidget(win);
#else
QApplication app(argc, argv);
GMap *win = new GMap();
app.setMainWidget(win);
win->show();
#endif
return app.exec();
}

当分はこの方法で開発を進めてみようと思います。

 

ubuntu で Qt/E 開発

めざせ Zaurus で GoogleMap ということで、ひとまず開発環境を整えないとです。

SLザウルスが出たのがだいぶ昔なので、Ubuntu に開発環境を構築できるのか? という心配もありましたが、なんとか一応開発できる環境が整いました。

ただ、色々試してみたのですが、x86環境でデバッグするためのqvfb用のバイナリがコンパイルエラーで作れませんでした。ホストの gcc が 2.96 じゃないとコンパイルできないようです。

でも、それじゃいちいち実機でデバッグしないといけなくなるので、qvfbを使わずに x86 上である程度デバッグできるように工夫してみました。

ちなみに使用した OS は Ubuntu 8.04 です。

1. ダウンロード

必要なものをダウンロードします。

ザウルスサポートステーションLinux関連 開発ツール一覧より

ザウルスサポートステーションライブラリリファレンスより

X/Qt Server Projectより (Trolltech社のサイトにはもうありませんでした)

以下は必須ではありませんが、開発入門として参考になるドキュメントです。

2. インストール

Ubuntu はdebian 系なので、一般的には alien を使って rpm を deb パッケージに変換してインストールするのが普通なのですが、私は面倒なので、rpmでインストールしてしまいました。

まずrpmをインストールします。

$ sudo apt-get install rpm 

rpmデータベースを作成し、rpm によるインストールを可能にします。

$ sudo mkdir /var/lib/rpm
$ sudo rpmdb --initdb

上でダウンロードしたrpmをインストールします。qtopia-free だけ依存関係のエラーがでるので–nodepsで強制インストールします。

$ sudo rpm -ivh binutils-cross-arm-2.11.2-0.i386.rpm
$ sudo rpm -ivh gcc-cross-sa1100-2.95.2-0.i386.rpm
$ sudo rpm -ivh glibc-arm-2.2.2-0.i386.rpm
$ sudo rpm -ivh linux-headers-arm-sa1100-2.4.6-3.i386.rpm
$ sudo rpm -ivh --nodeps qtopia-free-1.5.0-1.i386.rpm

Qtopia に 対して Zaurus 用の差分を追加します。libqte も差し替えます。

$ cd /opt/Qtopia
$ sudo tar xzf ??????/sharpsdk-pub-20021227.tar.gz
$ cd /opt/Qtopia/sharp/lib
$ mv libqte.so.2.3.2 libqte.so.2.3.2-bak
$ sudo cp ??????/libqte.so.2.3.2.gz .
$ sudo gzip -d libqte.so.2.3.2.gz 

tmake の設定ファイル(?)を差し替えます。

$ cd /opt/Qtopia/tmake/lib/qws/
$ sudo rm -rf linux-sharp-g++
$ sudo tar xzf ???????/tmake-sharp.tar.gz

以上でインストールは完了です。

3. 設定スクリプトの編集

ビルドする際に必要な環境変数等を設定するスクリプトが /opt/Qtopia/dev-arm-qpe.sh にあります。

このファイルのままでは、tmake にパスが通っていないため、tmake のパスを追加しておきます。

#!/bin/bash
CROSSCOMPILE=/opt/Embedix/tools
QPEDIR=/opt/Qtopia/sharp
QTDIR=/opt/Qtopia/sharp
PATH=$QTDIR/bin:$QPEDIR/bin:$CROSSCOMPILE/bin:$QPEDIR/bin:/ope/Qtopia/tmake/bin:$PATH
TMAKEPATH=/opt/Qtopia/tmake/lib/qws/linux-sharp-g++/
LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
PS1='!sharp-dev-arm\u@\h:\w\$ '
export QPEDIR QTDIR PATH TMAKEPATH LD_LIBRARY_PATH PS1

これで arm バイナリをビルドする環境が整いました。

長くなったので、x86環境などの続きはまた今度。