2012/04/18

C言語 GCC でコンパイル&リンク オプション

ソースファイルから実行ファイルまでの流れ

コマンドプロンプトで、gcc test.c とか打つと一発でexeファイルまで作れてしまうが、作業としてはコンパイルとリンクの2段階に分かれている。

1 コンパイル
テキストファイルであるソースファイル(拡張子.c)からオブジェクトファイルを作る。この作業がコンパイル。このオブジェクトファイルの拡張子は .o で、マシン語に翻訳されたもの。まだプログラムとしては実行できない。ファイルサイズはかなり小さくHelloWorldだと500byteぐらい。

2 リンク
オブジェクトファイルに標準関数などのライブラリの追加や、各種設定を行って、実行ファイルである.exeファイルを作る。ファイルサイズは大きくなって、HelloWorldで47KBぐらいになる。リンク作業を行うことで、はじめてプログラムとして機能する。

gccには多数のコマンドオプションがあって細かく制御できる。gccのサイトで確認できる。
http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
またコマンドの組合わせによっては複数同時に使うこともできる。使いそうなものだけをメモ。

オプションなし「a.exe」をつくる

gcc test.c
test.cという名のソースファイルから、exeファイルを作る。コンパイルとリンクがセットになった処理。exeの名前は指定していないので、すべて a.exe となる。また再度同じようにコンパイルすると、常に上書きされていく。ファイルがむやみに増えることもなく便利。

名前を指定して「test.exe」をつくる

gcc test test.c
test.exeという名前になる。

複数ソースファイルから「a.exe」をつくる

gcc test1.c test2.c
2つのファイルをコンパイル&リンクして、ひとつのa.exeをつくる。関数を別のファイルに分けたときなどに使う。もちろん名前の指定もできる。

-c コンパイルのみを行いオブジェクトファイル「test.o」をつくる

gcc -c test.c
リンク作業はしない。複数ファイルの場合は、それぞれの名前のオブジェクトファイルが作られる。

-o オブジェクトファイルから「a.exe」をつくる

gcc -o test.o
オブジェクトファイルに対してリンク作業を行って実行ファイルを作る。

-std=c89 c89準拠でコンパイル

gcc -std=c89 test.c
コンパイル時に、これを追加指定すると、c89準拠でコンパイルされ「a.exe」実行ファイルが作られる。「//」こういうコメントはc89準拠でないのでエラーになる。ただし、このオプションを付けると、exeファイルが大きくなってしまう。何もしないexeファイルが48kBだと、134kBぐらいになってしまう。

ファイルサイズの小さいexeを作る

gcc -s -o test test.c
上記を実行するとtest.exeというexeファイルを作る。何もしないexeファイルが48kBに対して、8kBという小さいexeになった。-s はシンボル情報を省く働きがある。

-v GCCのバージョンをチェックする

gcc -v
以下のような内容が表示される。
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32
/4.7.0/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.7.0/configure --enable
-languages=c,c++,ada,fortran,objc,obj-c++ --disable
-sjlj-exceptions --with-dwarf2 --enable-shared 
--enable-libgomp --disable-win32-registry --enable
-libstdcxx-debug --disable-build-poststage1-with-cxx 
--enable-version-specific-runtime-libs --build=mingw32 
--prefix=/mingw
Thread model: win32
gcc version 4.7.0 (GCC) 


C言語 ANSI C89 Meadow & MinGW GCC 目次