知っていると便利な gcc のオプション

back


GNU gcc を使う際に知っていると便利なオプションを挙げておきます。

注意: これが全部ではありません。gcc には、ほかにも プロセッサ依存の細かいオプションが山のようにありますが、それらは ふつうあまり利用しないので省略しました。


一般的なオプション

-c, -o, -I, -g, -O, -L, -l
省略。それくらい知ってること。ちなみに -L と -l は ld へのオプションであり、順番が重要である。
-pipe
各ステージ間で情報のやりとりをするのに temporary file を使わず、 pipe を使うようにする。このオプションが Makefile などに 含まれているときは、たいてい除いたほうがよい。なぜなら、 多くのシステムでは、アセンブラ側がパイプに対応してないから。

言語仕様に関するオプション

-ansi
厳格な ANSI 仕様でコンパイルする。このとき、 __STRICT_ANSI__ マクロが定義される。
-traditional
従来の C 仕様でコンパイルする。
-funsigned-char
何も指定されていないただの char は、すべてデフォルトで unsigned char とみなす。
-fsigned-char
何も指定されていないただの char は、すべてデフォルトで signed char とみなす。

マクロの使用とデバッグに関するオプション

-Dmacro, -Dmacro=value [知ってると便利]
臨時にマクロを定義する。
-Umacro
臨時にマクロを未定義にする。
-E
マクロの展開だけをする。
-C (with -E)
マクロの展開だけをするとき、コメントは残す。
-P (with -E)
マクロの展開だけをするとき、#line 行を生成しない。
-M (with -E) [知ってると便利]
ソースに include されているファイル名をすべて表示する。
-MM (with -E)
ソースに include されているファイル名をすべて表示するが、 システムが最初から include しているものは除く。
-dM (with -E) [知ってると便利]
ソース中で一度でも参照されたマクロ定義をすべて表示する。
-dD (with -E)
ソース中のマクロ定義、およびプロトタイプ定義をすべて表示する。

リンクに関するオプション

-rpath
ダイナミックリンクライブラリ .so の置き場を指定するオプション。 しかし、これは gcc は認識してくれない。gcc から ld を 呼び出すときにこのオプションを渡すには、以下に示すような -Xlinker を使うか、環境変数 LD_RUN_PATH に .so のパスを入れて gcc を 実行すればよい。
-Xlinker
ld に渡すオプションを指定する。1つのトークンにつき -Xlinker を 一回使わねばならない。たとえば ld に“-rpath /usr/local/lib”を 渡したいときは、-Xlinker -rpath -Xlinker /usr/local/lib と指定する。
-static
実行形式ファイルの生成にダイナミックリンクを使わない。
-shared
Shared object (.so) を生成する (サポートしている機種のみ)。

警告オプション

-fsyntax-only
構文を検査する。なにも出力しない。
-w
Warning メッセージをすべて抑制する。
-pedantic
Gcc の言語拡張機能をすべて無効にする。
-W
余計な warning まで出力する。
-Wimplicit
暗黙の宣言をすべて警告する。
-Wreturn-type
帰り値の宣言がされておらず、 default として int を返すとみなされた関数を警告する。
-Wunused
使用されていないローカル変数について警告する。
-Wswitch
switch 文を enum された型に適用している場合で、 定数としては存在するのに case がない場合を警告する。
-Wcomment
コメントが入れ子になっていそうなもの (/* が 2回現れる) を警告する。ふつう、コメントは入れ子にできない。
-Wformat
Printf や scanf などで、フォーマット中に指定した 引数と実際の個数が一致していなければ警告する。
-Wuninitialized
初期化されずに参照された変数について警告する。
-Wall
上にあげた警告オプションをすべて有効にする。 デバッグ中は、これがいちばんいい。

Last Modified: Sat May 12 15:46:48 EDT 2007 (05/13, 04:46 JST)
Yusuke Shinyama