2007/07/13

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」へ続く。

0 件のコメント: