gcc

gccとは

GCC(GNU C Compiler)は、ANSI規格 (ANSI X3.159-1989) 準拠のC言語コンパイラです。

なお、GNU Compiler Collectionは、GNUのコンパイラ群です。

GNU C++コンパイラをG++、GNU JavaコンパイラをGCJ、GNU AdaコンパイラをGNATと呼びます。


gccの使い方

コマンドラインから簡易的にコンパイルする場合など、基本的な使い方のみ記述します。

複雑な構成のソースコードを一括してコンパイルする場合にはMakefileやautotoolsなどを利用します。

コマンドの詳細やOSによる仕様の違いなどは、コマンドマニュアル(man gccコマンド)で確認してください。


コンパイル:ソースコードから実行ファイルを作成する。

コンパイル先バイナリ名が指定されていない場合、実行ファイル「a.out」が作成されます。


$ gcc program.c
$ ./a.out

実行ファイルの名前を変えたいときは、「-o」(オーの小文字)オプションを使います。

以下のコマンドで、実行ファイル「program」が作成されます。


$ gcc -o program program.c
$ ./sample

複数のソースコードをコンパイルする場合は、ソースコードを列挙します。


$ gcc -o program program.c program.c program.c

オブジェクトの作成

コンパイルのみ実行すると、オブジェクトファイルが生成されます。

以下のコマンドで、オブジェクトファイルprogram.oが作成されます。


$ gcc -c program.c

作成したオブジェクトファイルをリンクには以下のコマンドを実行します。


$ gcc -o program program.o

ライブラリをリンクする

コンパイルする際、外部ライブラリを必要とする場合、「-l」を使います。

curses.hの場合「-lcurses」となります。


$ gcc program.c -lcurses

コンパイラの警告を表示する

ワーニング(コンパイル時の警告)を全て表示するには、「-Wall」オプションを使います。


$ gcc -Wall -o program program.c

デバッグ情報を生成

デバッグ情報を生成するには、「-g」オプションを使います。

このオプションを付けることにより、gdbなどでデバッグが出来ます。


$ gcc -g -o program program.c

最適化

最適化を行いたい時は、「-O2」(オーの大文字)オプションを使います


$ gcc -O2 -o program program.c

シンボル情報を削除する

「-s」オプションでコンパイルすると、出力ファイルから全てのシンボル情報を省くため実行ファイルのサイズが減少します。

stripコマンドを実行することと同じです。


$ gcc -s -o sample sample.c

OS開発で使用するオプション

-nostdinc ヘッダファイルのための標準のシステムディレクトリを検索しません。‘-I’オプションによって指定したディレクトリ (またはカレントディレクトリ) のみを検索します。‘-nostdinc’ と ‘-I-’を使用することにより、インクルードファイルの検索パスを明示的に指定したディレクトリのみに限定することが可能となります。
-nostdlib リンク時に、標準のシステムライブラリとスタートアップファイルを使用しません。指定したファイルのみがリンカに渡されます。
-fno-buitin ビルトイン関数のうち、2つのアンダースコアで始まるもの以外を認識しなくなります。現在、この指定は_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy, strlen の関数に影響を及ぼします。
-ffreestanding フリースタンディング実行環境 (freestanding environment) 用にコンパイルを行います。これにより、‘-fno-builtin’ オプションが有効になり、また、 main に特別な条件は不要とみなします。

gccオプション

「-Wall」

「-Wall」は、一般的に問題があると思われる構文に対して警告を出します。

「-Wall」オプションは、以下のオプションを全て指定したものに等しい。


   -Wno-import
   -Wchar-subscripts
   -Wcomment
   -Wformat
   -Wno-format-y2k
   -Wno-format-extra-args
   -Wno-format-zero-length
   -Wformat-nonliteral
   -Wformat-security
   -Wformat=2
   -Wnonnull
   -Wimplicit-int
   -Wimplicit-function-declaration
   -Werror-implicit-function-declaration
   -Wimplicit
   -Wmain
   -Wmissing-braces
   -Wparentheses
   -Wsequence-point
   -Wreturn-type
   -Wswitch
   -Wswitch-default
   -Wswitch-enum
   -Wtrigraphs
   -Wunused-function
   -Wunused-label
   -Wunused-parameter
   -Wunused-variable
   -Wunused-value
   -Wunused
   -Wuninitialized
   -Wunknown-pragmas
   -Wstrict-aliasing

-W オプション

「-W」オプションは、チェックが望まれるであらう項目に対して警告を出します。

  • 関数の戻り値のあり/なしが定まっていない場合、警告を出す。
  • 「式」や「カンマ式の左辺」に副作用がない場合、警告を出す。
  • 符号なしの値を、< や >= で 0 と比較している場合、警告を出す。
  • x<=y<=z のような比較式に対して警告を出す。
  • static のような記憶クラス指定子が宣言の最初でないところにある場合、警告を出す。
  • 関数の戻り値タイプが const のような型修飾子の場合、警告を出す。
  • -Wall 若しくは -Wunused を一緒に指定すると、未使用の引数を警告する。
  • 符号付きの値と符号なしの値を比較して、符号付きの値が符号なしに変換されると、正しくない結果を得ることがあるので、警告を出す。
  • 集合型が部分的に中括弧で初期化されている場合、警告を出す。
  • 集合型の初期化子が全てのメンバーを初期化していない場合、警告を出す。


関連ページ