基本を再チェック〜gcc〜 |
YAMAMORI Takenori ●yamamori |
gccでプログラムをコンパイルしたり,あるいはgcc自体の動作を確認するためには, とりあえず何らかのソースファイルを用意しなければなりません. こういう場合,単に“Hello World !”と表示するだけの hello.cのような短いプログラムが役に立ちます.
#include <stdio.h> main() { printf("Hello World !\n"); return 0; } |
それでは実際にhello.cをコンパイルしてみましょう. ここでは次の実行例ようにコマンド操作を進めます.
$ gcc hello.c ← (*1) $ ./a.out ← (*2) Hello World ! $ rm a.out $ make hello ← (*3) cc hello.c -o hello $ ./hello Hello World ! $ size hello ← (*4) text data bss dec hex filename 847 224 24 1095 447 hello $ CC=gcc; export CC ← (*5) (※注1) $ CFLAGS=-O2; export CFLAGS $ rm -f hello hello.o ← (※注2) $ make hello ← (*6) gcc -O2 hello.c -o hello $ ./hello Hello World ! $ size hello ← (*7) text data bss dec hex filename 831 224 24 1079 437 hello |
gccでhello.cをコンパイルする最も簡単な方法は, オプションを付けずに単に「gcc hello.c」とコマンド入力することです. これだけでとりあえずコンパイルはできます.(*1) しかしこれでは,出力される実行バイナリファイルのファイル名が, デフォルトのa.outになるだけでなく, コンパイル時の最適化も行なわれていないため, 非効率な実行ファイルができてしまいます.(*2)
通常は,gccには各種のオプションを付けて起動します. これらのオプションはコマンドラインで入力することになりますが, 長いオプションを入力するのは少々大変かも知れません. そこで,makeコマンドを,Makefileなしで使う方法を紹介します. ここでは深いことは考えず,試しに「make hello」とだけ入力してみて下さい. Makefileなしでもmakeコマンドが動作し, コンパイルが行なわれることがわかるはずです.(*3)
この場合,デフォルトのCコンパイラであるccが, 「-o hello」オプションを付けた状態で起動されています. ここで「-o」は出力ファイルを指定するオプションで, これによってa.outではなくhelloという実行バイナリファイルができます. なお,ここではコンパイラがgccではなくccとなっていますが,LinuxやFreeBSDでは, ccは結局gccにシンボリックリンク(またはハードリンク)されているので, これでOKなのです.(ただし,Solarisでccがない場合はエラーになるでしょう) ここで,あとでの比較のため,sizeコマンドでバイナリサイズを調べておきます.(*4)
次に,環境変数としてCCとCFLAGSに, 適切な値をセットした状態で再度コンパイルを行なってみましょう.(*5) すると今度は「make hello」と打つことにより, 「gcc -O2 hello.c -o hello」が実行されるようになります.(*6) 「-O2」は最適化レベル2のオプションです. 再びsizeコマンドでhelloのサイズを調べてみると, 最適化により,実行バイナリのサイズも減少していることがわかります.(*7) なお,環境変数CCやCFLAGSの値は,login時に好みの値が自動的にセットされるように, $HOME/.profileなどに記述しておくとよいでしょう.