2009年07月30日
gccの便利なオプション (-save-temps)
私がよく使うgccの -save-temps というオプションを紹介します。
gccはCのソースプルグラムをコンパイルするときに、プリプロセッサ、コンパイラ、アセンブラ、リンカがそれぞれ動作し、その間のやりとりには中間ファイルが作成されます。
通常は中間ファイルはテンポラリディレクトリに作られて用が済んだら消されてしまいます。しかし、gccにコンパイルオプション -save-temps をつけるとこれらの中間ファイルがカレントディレクトリに作られてそのまま残ります。
$ gcc -save-temps hello.c
とすると、 hello.i, hello.s, hello.o がカレントディレクトリにできます。
hello.i がプリプロセッサを通した後の結果でhello.s がアセンブラ出力の結果です。
コンパイルエラーになった時にそのエラーの原因がソースをみただけではマクロやデファイン値が込み入っていてわかりにくい時には、この.iファイルを見るとよいです。また、同じ名前のヘッダファイルが複数のディレクトリにあって、いったいどっちをインクルードしているのかがわかりにくい時にも役に立ちます。
プリプロセッサの結果を得るには gcc に -E オプションをつけるほうが一般的かもしれませんが、少し複雑なビルド環境では -cオプションを -E に変えたりすると.oファイルが生成されないために変なビルドエラーになったりして少々気持ち悪いです。
そんなときに -save-temps オプションは楽です。
Makefileに一行追加するだけです。
CFLAGS += -save-temps
これが原因でビルドエラーになることはありませんし、止める場合はこの行をコメントアウトするだけです。
(追記)
現在開発が進んでいるgcc 4.5では -save-tempsの機能が拡張されて、中間ファイルが生成されるディレクトリがカレントディレクトリだけでなく、-o オプションで指定されているファイルと同じディレクトリにすることもできるようになります。