ラベル Qt の投稿を表示しています。 すべての投稿を表示
ラベル Qt の投稿を表示しています。 すべての投稿を表示

2007/07/17

KDEプログラミング その5

KDEプログラミング その4」の続きです。

あいかわらずよくわからずにやっています。
どんな方法が正しいのか分かりません。


それではチュートリアルを再開します。
今回は「P3」を行いました。

とりあえずチュートリアルにあるmain.cpp, p3.h, p3.cppを作成します。
$ ls
main.cpp p3.cpp p3.h



KDEプログラミング その2」と同様の手順でmakeを行ってみます。
$ qmake -project
$ echo INCLUDEPATH += /usr/include/kde >> p3.pro
$ echo LIBS += -lkdeui -L/usr/lib/kde3 >> p3.pro
$ qmake
$ make
g++ -c -pipe -Wall -W -I/usr/include/freetype2 -O2
-m32 -march=i386 -mcpu=i686 -DQT_NO_DEBUG
-I/usr/lib/qt3/mkspecs/default -I. -I. -I/usr/include/kde
-I/usr/lib/qt3/include -o main.o main.cpp

 〜略〜

g++ -o p3 main.o p3.o moc_p3.o -L/usr/lib/qt3/lib
-L/usr/X11R6/lib -lkdeui -L/usr/lib/kde3 -lqt-mt
-lXext -lX11 -lm
p3.o(.text+0xad4): In function `MainWindow::fileOpen()':
: undefined reference to
`KFileDialog::getOpenURL(QString const&,
QString const&, QWidget*, QString const&)'
p3.o(.text+0xd64): In function `MainWindow::fileSave()':
: undefined reference to
`KFileDialog::getSaveURL(QString const&,
QString const&, QWidget*, QString const&)'
collect2: ld はステータス 1 で終了しました
make: *** [p3] エラー 1


エラーになってしまいました・・・。
今まで一度もすんなりといったことがありません。


エラーの内容を見てみると、リンク中にgetOpenURL()とgetSaveURL()が見つからないと言っている気がします。

チュートリアル
では次のような記述があります。
Note that you're encouraged to allow the user to open any URL not just local files. For this, we have used a getOpenURL dialog, which lets the user select any url. Check below for an example on how to use the KIO library.


またKFileDialog::getOpenURLの関数リファレンスはこちらにあります。

KIO Libraryに含まれるのは確かのようなので、多分リンク時に"-lkio"とか入れるのでは無いかと想像しました。
探してみると/usr/lib/libkio.soというのがありましたので、当たりかなと。


そこで最初からmakeの手順をやり直してみます。
$ make clean
rm -f moc_p3.o
rm -f moc_p3.cpp
rm -f main.o p3.o
rm -f *~ core *.core
$ ls
Makefile main.cpp p3.cpp p3.h p3.pro
$ rm Makefile p3.pro
$ ls
main.cpp p3.cpp p3.h


プロジェクトファイルから作りなおします。
$ qmake -project
$ echo INCLUDEPATH += /usr/include/kde >> p3.pro


リンクするライブラリに"-lkio"を追加します。
"-lkui"ももちろん入れておきます。
$ echo LIBS += -lkdeui -lkio -L/usr/lib/kde3 >> p3.pro


一応p3.proの確認です。
$ tail -n3 p3.pro
SOURCES += main.cpp p3.cpp
INCLUDEPATH += /usr/include/kde
LIBS += -lkdeui -lkio -L/usr/lib/kde3


一気にmakeまで行います。
$ qmake
$ make
g++ -c -pipe -Wall -W -I/usr/include/freetype2 -O2
-m32 -march=i386 -mcpu=i686 -DQT_NO_DEBUG
-I/usr/lib/qt3/mkspecs/default -I. -I.
-I/usr/include/kde -I/usr/lib/qt3/include
-o main.o main.cpp
main.cpp: function 内の `int main(int, char**)':
main.cpp:6: 警告: `__comp_ctor' is deprecated
(declared at /usr/include/kde/kapplication.h:205)
g++ -c -pipe -Wall -W -I/usr/include/freetype2 -O2
-m32 -march=i386 -mcpu=i686 -DQT_NO_DEBUG
-I/usr/lib/qt3/mkspecs/default -I. -I.
-I/usr/include/kde -I/usr/lib/qt3/include
-o p3.o p3.cpp
/usr/lib/qt3/bin/moc p3.h -o moc_p3.cpp
g++ -c -pipe -Wall -W -I/usr/include/freetype2 -O2
-m32 -march=i386 -mcpu=i686 -DQT_NO_DEBUG
-I/usr/lib/qt3/mkspecs/default -I. -I.
-I/usr/include/kde -I/usr/lib/qt3/include
-o moc_p3.o moc_p3.cpp
g++ -o p3 main.o p3.o moc_p3.o -L/usr/lib/qt3/lib
-L/usr/X11R6/lib -lkdeui -lkio -L/usr/lib/kde3
-lqt-mt -lXext -lX11 -lm
$ ls
Makefile main.cpp main.o moc_p3.cpp moc_p3.o p3*
p3.cpp p3.h p3.o p3.pro


make成功し、実行ファイルp3が作成されました。
早速実行してみます。
$ ./p3

動きました。


ソースの中身をまだ詳細を理解していないため、次はp3のソースをもっと調べることにします。
KIO Libraryを含めて。

英語だけど。

2007/07/13

KDEプログラミング その4

KDEプログラミング その3」の続きです。

引きつづき前々回のmake中に実行されたgcc(g++)コマンドのオプションを調べます。

(2) g++ -o p2 main.o -L/usr/lib/qt3/lib -L/usr/X11R6/lib -lkdeui -L/usr/lib/kde3 -lqt-mt -lXext -lX11 -lm

-o:
(1)でも出てきましたが、出力先を指定します。
今回の出力先はp2ということになります。

実行ファイルを作る場合、-oオプションを省略するとa.outというファイルが作成されるようです。


-L:
-Ldirという形式でdirを-lオプションにより検索されるディレクトリのリストに追加します。


-l:
フォントによっては分かりづらいですがL(エル)の小文字です。

マニュアルから抜粋します。
名前が library であるライブラリをリンク時に使用します。

リ ン カは、標準のライブラリ用ディレクトリのリスト中から、実際のファイル名が`liblibrary.a' であるファイルを検索します。リンカはこのファイルを、ファイル名で直接指定した場合と同様に使用します。

検 索するディレクトリには、いくつかの標準システムディレクトリと、`-L' によって指定したディレクトリが含まれます。


このあたりは以下のサイトでも読んで、もう少し勉強したいと思います。
  オブジェクト不指向の共用オブジェクト(developerWorks)


とりあえず、以上です。


KDEプログラミング その5」に続く。

KDEプログラミング その3

KDEプログラミング その2」の続きです。

チュートリアルはちょっと休憩して、gcc(g++)で使用していたコンパイルオプション位は調べてみます。

数年前に一通り調べたような記憶はあるのですが、すっかり忘れました。


前回make中に実行されたgcc(g++)コマンドは2つでした。

まず一つめです。
(1) g++ -c -pipe -Wall -W -I/usr/include/freetype2 -O2 -m32 -march=i386 -mcpu=i686 -DQT_NO_DEBUG -I/usr/lib/qt3/mkspecs/default -I. -I. -I/usr/include/kde -I/usr/lib/qt3/include -o main.o main.cpp

-c:
これはmanページを参照すると次にようにありました。
ソースファイルを、コンパイルまたはアセンブルまではしますが、リンクはしません。コンパイラの出力は、それぞれのソースファイルに対応したオブジェクトファイルとなります。

要するにmain.cppからmain.oを作っているようです。


-pipe:
manページからです。
コンパイル時のステージの間のデータの受け渡しに、テンポラリファイルではなくパイプを使用します。いくつかのシステムではアセンブラがパイプからの入力を受け付けることができないために、このオプションを指定すると失敗します。GNU アセンブラでは問題なく使用できます。

このオプションを使うメリットってなんなのでしょうか?
テンポラリファイルを使わないということなので、無駄な記憶領域を使わないとかかな?
そんなこともないか。

と疑問に思ったのでGoogleで調べてみると、記述のあるサイトがありました。
コンパイルにかかる時間が短縮されるが、より多量のメモリが必要。

アセンブラがパイプからの入力をサポートしていないシステムもあるということですが、前回も書いたとおりMakefileはqmakeを使用して作成していますので、もしかしたらqmakeがそのあたりを調べて-pipeオプションを付けるかどうか判断しているのかもしれません。


-Wall:
-W:
-Wallは覚えているのですが、-Wは何でしょう?
マニュアルの-Wallの項目には次のようにあります。
全ての上に挙げた `-W' オプションを結合したものです。これらのオプションは全て、たとえマクロとの組み合わせであっても、避けたほうがいいと我々が推奨する用法や、簡単に避けることができると我々が信じている用法に関するものです。

ちなみに、-Wは-Wallより先に記述されています。
ということは「-Wオプションはいらないんじゃないの?」と思い、調べたところ次のサイトで詳しく説明されていました。
  gcc の警告オプション -Wall と -W

上記サイトによると、-Wは-Wallには含まれないようです。
-W オプションは、-Wall では無視されたけどチェックした方がよい場合がある項目に対して警告を出すらしいです。


-I:
フォントによっては分かりづらいですが、i(アイ)の大文字です。
これは覚えています。
マニュアルには次のようにあります。
インクルードファイルの検索するディレクトリのリスト中に追加します。

これは必ず覚えておかなければいけないですよね。


-O2:
最適化オプションです。
-O・-O1→-O2→-O3と最適化の度合が増すようです。
マニュアルの-O2の項目には、次のようにあります。
さらに最適化を行います。サポートされている最適化手段のうち、空間と速度 のトレードオフを含まないものはほとんどの全て使用されます。例えばループのアンローリングや関数のインライン化は行われません。 -O と比較して、このオプションはコンパイル時間と生成コードの性能の双方を増加させます。


私の記憶では最適化に-O2を使用していることが多いようです。
ネットで調べたところ明確な記述は見つからなかったのですが、最適化を強くすると値が不正確になる場合があると書いてあるサイトがありました。


-m32:
-mはターゲットマシン固有のオプションのようです。
次のサイトに記述がありました。
  最新x86CPUで堪能する極上32&64ビット・ライフ Part1(1)

32ビットアプリケーションとしてビルドする場合は-m32、64ビットアプリケーションとしてビルドする場合は-m64を指定するようです。


-march=i386:
-mcpu=i686:
次のサイトに記述がありました。
  GCC: CPU に関する最適化オプション

-marchは指定した CPU だけで動作するようなコードをし、-mcpu より速いコードを生成することが出来き、-mcpuは-marchと違って同系列の CPU でも動作するようなコードを生成するらしいです。

"-march=i386 -mcpu=i686"と指定すると、
・i686向けのコードを吐き出すけど、i386でも動く。
・i386系で速く動くコードを吐き出す。
ということでしょうか?
分かるような分からないような。


-DQT_NO_DEBUG:
-Dオプションは-Dmacroという形式でmacroに文字列"1"を与えているようです。

QT_NO_DEBUGはどう見てもQtのマクロなので、ソース中で使用しているのでしょう。
QT_NO_DEBUGはデバッグコードを無効にしているようです。


-o:
出力先を指定します。
今回の出力先はmain.oということになります。



あー疲れた。
続きはまた今度。

KDEプログラミング その3」へ続く。

KDEプログラミング その2

KDEプログラミング その1」のつづきです。

チュートリアルを続けます。
今回は行ったのは次のページです。
  p2 : A simple KDE "Hello World" application (Yahoo!翻訳)

前回はQt3のみを使用していましたが、今回はKDEのライブラリを少し使うようです。


前回同様にサンプルプログラムをそのまま打ち込みコンパイル・・・しようと思ってもコンパイル方法が書いていないのは予想通りです。
その程度で慌てません。

そこでまた探してみました。


(1) KDE本家のサイトからなんとか探す
このあたりを読んでみたのですが、よく分かりません。
英語ですし。

なんか、難しそうなことが色々書いてあります。
こんなに難しそうなことをしなくても、サンプルプログラムのコンパイルぐらい出来るだろうと考え、KDE本家のサイトから探すのは保留しました。


(2) 日本KDEユーザ会からなんとか探す
KDE-Tutorial "KDEによるGUI作成"というのがあったのでちょっと読んでみたのですが、コンパイル方法らしきものが見つかりませんでした。
ちゃんと読めば見つかるのかもしれません。

サンプルプログラムがあったので、それのMakefileを(たとえば-lqtを-lqt-mtに)修正してやろうとしたのですが、上手く行きません。
これがなんで上手く行かないのかは検証していないのですが、あとで確認したいと思います。


(3) なにか参考になりそうなソースを探す

KDE本家のダウンロードサイトにkdiffdate-1.0.tar.gzというのがありました。

ファイルサイズも10KBと小さいですし、参考になりそうです。

ダウンロードしてきて解凍し、中のINSTALLファイルを参考にコンパイルしてみました。
$ ./conifugre
$ make

ところが、makeでエラーになります。

./configure で作成したMakefileを見ると、次のところの値がとれていませんでした。
 -I$(KDEDIR)/include
 -L$(KDEDIR)/lib

Makefile中でKDEDIRを設定している箇所はありませんし、環境変数も設定されていません。
しょうがないので次のように修正しました。
 -I$(KDEDIR)/include → -I/usr/include/kde
 -L$(KDEDIR)/lib → -L/usr/lib/kde3

再度makeしました。
$ make

今度は成功したみたいです。


中に入っているconfigureファイルを確認したところ、このソフトkdiffdate.pro から Makefile を作成しているようです。

.proのファイルは前回はqmake -projectコマンドで作成しました。

kdiffdate.proを見てみると、KDE関連の追加と思われる次の箇所がありました。
 INCLUDEPATH += $(KDEDIR)/include
 LIBS += -lkdeui -L$(KDEDIR)/lib

さっき$(KDEDIR)とかあったのは、どうやらkdiffdate.proに書いてあったからのようです。多分。


(4) いよいよチュートリアルのプログラム(p2)をコンパイルする

なんとなくやることが見えてきましたので、再チャレンジです。

上記のとおり、色々試行錯誤してやっています。
正しいのか分かりません。
マネしないでください。


(a) p2.proの作成
$ ls
main.cpp
$ qmake -project
$ ls
main.cpp p2.pro


(b) p2.proの修正
$ cat p2.pro

 〜(略)〜

TEMPLATE = app
CONFIG -= moc
INCLUDEPATH += .

# Input
SOURCES += main.cpp


最後に次の2行を追加します。
 INCLUDEPATH += $(KDEDIR)/include
 LIBS += -lkdeui -L$(KDEDIR)/lib

$ echo INCLUDEPATH += /usr/include/kde >> p2.pro
$ echo LIBS += -lkdeui -L/usr/lib/kde3 >> p2.pro
$ tail -n3 p2.pro
SOURCES += main.cpp
INCLUDEPATH += /usr/include/kde
LIBS += -lkdeui -L/usr/lib/kde3


(c) Makefileの作成
$ ls
main.cpp p2.pro
$ qmake
$ ls
Makefile main.cpp p2.pro


(d) make
$ make
g++ -c -pipe -Wall -W -I/usr/include/freetype2 -O2
-m32 -march=i386 -mcpu=i686 -DQT_NO_DEBUG
-I/usr/lib/qt3/mkspecs/default -I. -I.
-I/usr/include/kde -I/usr/lib/qt3/include -o main.o main.cpp
main.cpp: function 内の `int main(int, char**)':
main.cpp:7: 警告: `__comp_ctor' is deprecated (declared at
/usr/include/kde/kapplication.h:205)
g++ -o p2 main.o -L/usr/lib/qt3/lib
-L/usr/X11R6/lib -lkdeui -L/usr/lib/kde3
-lqt-mt -lXext -lX11 -lm
$


警告は出ますが、なんとか出来たみたいです。


それでは実行してみます。
$ ./p2



おおっ。
前回のQtプログラムと若干違うみたいです。
ちなみに前回はこんな感じでした。



これがKDEの底力か!

・・・警告が気になりますけど。


しかし、サンプルプログラムでこんなにてこずるとは。

ちゃんと読めば、「(1) KDE本家のサイトからなんとか探す」で分かった気がします。


KDEプログラミング その3」へ続く。

KDEプログラミング その1

最近Vine Linux 4.1でKDEを使いはじめました。

で、リハビリがてらKDEのプログラミングでもしてみようかと思い付き、KDEの本家のページのチュートリアルでもやってみることにしました。
  Development/Tutorials/KDE3 (Yahoo!翻訳)

ちなみに、うちのVine Linux 4.1に入っているKDEは3.5.7、Qtは3.3.5みたいです。


まずはこちらの「Hello World!」のmain.cppをそのまま写してコンパイル・・・、しようとしたけどコンパイル方法が書いていない。

日本KDEユーザ会のチュートリアルのこちらのページの一番下にあるのに倣い、次のようにコマンドを叩きました。

$ g++ -I$QTDIR/include -o hello main.cpp
-L$QTDIR/lib -lqt
/usr/bin/ld: cannot find -lqt
collect2: ld はステータス 1 で終了しました


・・・エラーになります。

-lqtが見付からないということなので、探してみました。

$ ls $QTDIR/lib
libdesignercore.a libqt-mt.so@ libqt-mt.so.3.3.5*
libqui.so.1.0@ libeditor.a libqt-mt.so.3@
libqui.so@ libqui.so.1.0.0* libqassistantclient.a
libqt-mt.so.3.3@ libqui.so.1@


確かにlibqt.soとかはありません。

libqt-mt.soというのがなんとなく当たりかなと想像し、これで試してみました。

(ちなみに次に打ったコマンドは試行錯誤中のものです。これが正解ではないと思います。)

$ g++ -I$QTDIR/include -o hello main.cpp
-L$QTDIR/lib -lqt-mt

$ ls
hello* main.cpp


成功したみたいです。
実行してみたところ、次のようなプログラムが動きました。



ただ、「-lqt-mt」で正しいのか分かりません。
Qt3でのコンパイル方法をGoogleで調べてみたのですが、よく分かりませんでした。


Trolltechのサイトもチュートリアルがありました。
  Qt Reference Documentation (Yahoo!翻訳)

こちらを見てみるとg++を直接叩くのではなく、qmakeを使用してMakefileを作成しています。
それに倣ってやってみました。

$ rm hello ←最初に作ったプログラムを削除
$ qmake -project
$ ls
main.cpp p1.pro
$ qmake
$ ls
Makefile main.cpp p1.pro


Makefileが出来たみたいです。

それではmakeしてみます。

$ make
g++ -c -pipe -Wall -W -I/usr/include/freetype2 -O2
-m32 -march=i386 -mcpu=i686 -DQT_NO_DEBUG
-I/usr/lib/qt3/mkspecs/default -I. -I.
-I/usr/lib/qt3/include -o main.o main.cpp
g++ -o p1 main.o -L/usr/lib/qt3/lib
-L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm
$ ls
Makefile main.cpp main.o p1* p1.pro


p1というプログラムができました。

p1という名前になったのは、カレントディレクトリがp1だからだと思います。多分。

で、実行してみました。


動きました。
最初のとまったく同じですけど。


こんな感じで、少しずつ覚えてみようかと思います。


最近できたGoogleブック検索でタイトルQtで調べると、他の国ではQt3とかQt4の本が出てきますね。

アマゾンで調べると「Qt GUIプログラミング」という本が見つかりました。

レビューを読むとQt3みたいです。

私もとりあえずKDE3とQt3を使ってみようと思っているので参考に買ってみようかな。


KDEプログラミング その2」につづく