5. C コンパイラ / gcc

C言語によるプログラミングでは gcc コマンドを使う. 利用しながらできるだけ使い方に習熟していくこと. なお,"デバッガ / gdb & DDD" の使い方は別のページを参照すること.

5.1. コンパイル&リンク

よく使うオプション(表 3)と,実行コマンドの例をいくつか掲載する.

表 3 gccでよく使うオプション(抜粋)

オプション

意味

-o filename

コンパイル結果を filename というファイルに出力する.小文字のオー.

指定しない場合,Linux系OSなら a.out,Windows OSなら a.exe が作成される.

-g

gdb 用のシンボルを含めてコンパイルする

-O0

最適化をおこなわないでコンパイル.大文字のオーと数字の0.

-O2

最適化をおこないながらコンパイル.大文字のオーと数字の2.

-Wall

全ての警告メッセージを表示する.

-l_libname

ライブラリ lib_libname をリンクしながらコンパイルする.小文字のエルである.

オプション指定子 -l_libname の間に空白は入れない.

例えば,libm.a をリンクするなら,-lm とする.

例えば,libncurces.a をリンクするなら,-lncurces とする.

5.1.1. 実行コマンドの例1 (非推奨)

kadai3.c というファイルをコンパイル(+リンク)する.a.out という実行ファイルが出力される.

$ gcc kadai3.c

このコンパイル方法は演習等の講義中に常用すべきではない. ちょっとしたプログラムを書いて少し試したい,程度の利用にとどめること

5.1.2. 実行コマンドの例2

kadai3.c というファイルをコンパイル(+リンク)して,kadai3_dev という実行ファイルを作る. ただし,警告メッセージの表示をするようにし,また,コンパイル時の最適化を行う.

$ gcc -Wall -O2 -o kadai3_dev kadai3.c

オプションの大文字小文字や順番に注意すること.特に,小文字 -o の後は出力ファイル名であることに,注意すること. 誤って,-o の直後にソースファイル名を書くと,ソースファイルが失われる場合がある.

なお,この方法でコンパイルをすると,ループの最中に配列のインデックスを超えたアクセスをしている場合に, 警告が表示される.つまり,一部のバッファオーバーランを検出できる.(あくまで,一部のみ,である.)

5.1.3. 実行コマンドの例3

kadai3.c というファイルをコンパイル(+リンク)して,kadai3_dbg という実行ファイルを作る. ただし, gdb でデバッグがしやすい実行ファイルにする.

$ gcc -O0 -g -o kadai3_dbg kadai3.c

5.1.4. 実行コマンドの例4

kadai3.c というファイルをコンパイル(+リンク)して,kadai3_dev2 という実行ファイルを作る. ソースファイルで #include <math.h> を使用しており,数学関数が必要な場合には,以下のコンパイルコマンドが一例となる.

$ gcc -lm -o kadai3_dev2 kadai3.c

5.2. 関数のヘルプ

C言語の標準的な関数(例えば,stdio.hstdlib.h などに定義されている関数)は, man コマンドでヘルプを見ることもできる. 例えば,C言語の printf() 関数の使い方を知りたいときは,

$ man 3 printf

と,実行する.ここで,第1引数に 3 を与えていることが,重要な意味を持つ. 3 を忘れると,シェルコマンドの printf のマニュアルが表示されてしまう(やって確かめてみよう).

5.3. FAQ

►Q. コンパイルオプションで -O0 をつけると正しく動作するが, -O2 をつけると正しく動作しない.

A. 変数の初期化を忘れていないか,確認してみること. あるいは,ループ処理において予期せぬバッファオーバランが発生していないか,精査すること.

注釈

最適化オプションの有無により,未定義の変数の内部処理が変わる場合がある.

►Q. 自作のヘッダーファイルを含むファイルをコンパイルしているが,自作のヘッダーファイルの変更が反映されていないようである.

A. 誤って,ヘッダファイルに対して gcc でコンパイルしたことはないか? もしそうであれば,例えば, myfunc.h というヘッダファイルに対して, myfunc.h.gch というファイルが作られているはずである. カレントディレクトリ以下の *.h.gch はいずれも消してから,再度コンパイルを試してみるとよい.

注釈

拡張子 .h.gch のファイルは,プリコンパイルヘッダーと呼ばれるファイルである. 巨大なプログラムを書く際には,このファイルを事前に作成することで,コンパイル時間を削減することができる.

►Q. Windowsで作成したソースコードを,Linuxでコンパイルして実行しているのだが,プログラムの動作がおかしい.

A. 1行コメント // を使っており,かつ,日本語のコメントを使っていないか? もしそうであれば,日本語のコメントの最後に半角のピリオドをつけると改善する場合がある. あるいは,行コメントではなく,範囲コメントの利用を考えること. あるいは,英語でコメントを書くこと.

注釈

日本語を含む1行コメントを書くと,次の行もコメント扱いになってしまう事がある. 特に,Shift JIS エンコーディングで書かれたファイルでよく発生する.

►Q. デバッグ用の printf を入れると正しくプログラムが動作するが,その行を消すとプログラムが動作しない.

A. printf の直前で1行コメントを使っているならば,上記の Q&A を参照せよ.

5.4. 参考書