ぺんぎんノート

momoiro_tjのノート (旧:システムオペレータの週末)

知っておくべきgccオプション

三連休で何かしないとな、とおもいgccのmanページを読んでいた。結局1日では時間が足りず中途半端な感じになってしまった。1日無駄にしたなーなんて思う。なので、とりあえず分かったことだけでもまとめとこうと思う。

今日gccのmanページを読もうと思った理由は、なんとなくgcc極めたいなーと思ったからだ。とりあえず先頭から読み始めたが、正直これ通常の開発とかで使うのだろうか・・・と思ったころにはもう夕方だった。ふとページの先頭に戻ってみたらSYNOSPSISを改めてみてみると、これだけ知ってれば十分じゃないか?と気づいたわけだ。

なので結論はタイトルの通りだと思った。

しかし、コンパイラのオプションってほんとに多い。Visual Studioを初めて触ったとき、デフォルトでいろんなオプションが設定されていて意味が分からなかった。Visual Studioコンパイルオプションは正直いまでも詳しくはわからない。半面、gccコマンドラインからソースファイルさえ指定すればそれらしくできるからとてもシンプルに見える。実際は内部でいろんなパラメータが設定されているんだろうが・・・・。

知っておくべきgccオプション

以下はman gccで表示したmanページのSYNOPSISに書かれているgccの例。gccのオプションはもっとたくさんあるがこれだけ知っていればいいのでは、というのが今日の結論だ。それぞれのオプションがどういう意味なのか簡単に残しておくことにする。

   gcc [-c|-S|-E] [-std=standard]
       [-g] [-pg] [-Olevel]
       [-Wwarn...] [-Wpedantic]
       [-Idir...] [-Ldir...]
       [-Dmacro[=defn]...] [-Umacro]
       [-foption...] [-mmachine-option...]
       [-o outfile] [@file] infile...

[ -c | -S | -E ]オプション

コンパイルの実行を制御するオプション。-cプリプロセス、コンパイルアセンブルをするがリンクはスルーする。-Sプリプロセス、コンパイルを行うがアセンブル、リンクをスルーする。-Eプリプロセスはするがコンパイルアセンブル、リンクをスルーする。

-cはオブジェクトファイルを出力し、-Sアセンブラコードを出力し、-Eプリプロセス済みのソースコードを出力する。

まとめると以下の表になる。-Eのみ、出力がファイルではなく標準出力になることに注意する。

オプション プリプロセス コンパイル アセンブル リンク 出力形式
-c × file.o(オブジェクトファイル)
-S × × file.s(アセンブラファイル)
-E × × × (プリプロセスを行ったコードを標準出力へ出力)

[ -std=standard ]オプション

C99など、C言語で準拠する規格を指定する。プロジェクトで準拠する規格があれば指定する必要がありそう。なお、C/C++のみに適用可能なオプション。

[ -g ]オプション

デバッグ情報を出力する。GDBを使う場合にこのデバッグ情報を使用する。

[ -pg ]オプション

gprofでプログラムを解析する際に使用するプロフィール情報を出力する。

[ -Olevel ]オプション

-O1-O3などでコンパイルで最適化するレベルを指定する。内部で自動的に各レベルごとに決められた最適化オプション(Optimize Options)を指定してくれているらしい。

[ -Wwarn... ]オプション

表示する警告の設定。-Wallなどがよく使われているイメージ。

[ -Wpedantic ]オプション

拡張機能に対して警告を表示する設定。

[ -Idir... ]オプション

dirに指定したディレクトリをヘッダファイルなどの検索対象に追加する。

[ -Ldir... ]オプション

dirに指定したディレクトリを、リンクしたいライブラリの検索対象に追加する。

[ -Dmacro[=defn]... ]オプション

#defineコマンドラインで設定する。

[ -Umacro ]オプション

定義済みのマクロをキャンセルする。ソースコード中のマクロまたは、このオプションの前に-Dで定義したマクロのキャンセルができる。

[ -foption... ]オプション

指定するとoptionを有効にする。いろんなオプションがある。

[ -mmachine-option... ]オプション

ハードウェア固有のオプションを有効にする。

[ -o outfile ]オプション

出力ファイル名を指定する。指定しないとa.outなどになる。

[ @file ]

コマンドラインオプションをファイルから読み取る場合に、コマンドラインオプションが記述されたファイルを指定する。

infile...

入力ファイルを指定する。必須。


このベースさえ覚えておけば、あとはmanなりhelpなりを都度参照すれば何とかなりそう。特に-foptionとか-mmachine-optionはハードやソフトに何らかの制約がある場合に指定すると思うので、その都度調べて使うような使い方になりそう。

あとはどれだけ便利に使いたいか、というくらいじゃないだろうか。掘り下げていくといくらでも掘り下げられそうだ。