3.コンパイラのいろいろな使い方

ここではコンパイラのいろいろな使い方を見ていきます。なお、LSI-Cコンパイラを基に説明しているので他のコンパイラでは必ずしもこの通りではないかもしれません。

☆1つのソースファイルから実行ファイルを作る lcc source.c
 
今まではこの方法コンパイルしてきました。もっとも基本的な使い方です。
コンパイルに続いてリンクも行います。

☆複数のソースファイルから実行ファイルを作る lcc source1.c source2.c source3.c
 
複数個の場合でもソースファイルを並べて指定するだけです。
この場合、それぞれコンパイルされて source1.obj、source2.obj、source3.obj の3つのオブジェクトファイルを作り、それらをリンクして1つの実行ファイルになります。
なお、作成される実行ファイルの名前は一番最初に指定されたソースファイル名からとります。この場合は、source1.exe という名前で実行ファイルができます。

☆ファイル名を指定して実行ファイルを作る lcc -o test.exe source1.c source2.c
 
オプション -o を指定すると作成される実行ファイルのファイル名を変えられます。
この場合は、 test.exe となります。

☆コンパイルのみ行いリンクしない lcc -c source1.c source2.c
 
オプション -c を指定するとコンパイルを行うだけでリンクはしません。
上の場合は source1.obj と source2.obj が作成されますが、実行ファイルは作成されません。

☆オブジェクトファイルから実行ファイルを作る lcc source1.obj source2.obj
 
オブジェクトファイルだけでもソースファイルと同じように扱えます。本来これはリンカの役割ですが、リンカのみを使おうとするとリンカの使い方も知らないといけないので、このようにコンパイラを通してリンクをしたほうが分かりやすくなります。

☆アセンブリファイルを出力する lcc -S source1.c
 
オプション -S を指定してコンパイルするとアセンブリファイルが出力されます。また、オプション -SC を指定すると変換前のソースコードがコメントとして挿入されるのでどのように変換されたかわかりやすくなります。
このファイルはテキスト形式なのでソースファイルと同じようにメモ帳などのエディタで編集可能です。アセンブリファイルの書式については高度の知識が必要なので説明しません。
* 興味がある方はエル・エス・アイジャパンのサイト内、フリーソフトウェア集にある「r86,lldオンラインマニュアル」を参考にしてください。

4.大きなプログラムを作るときには


プログラムがとても複雑であったり、大きくなったりした場合、複数のソースファイルに分割した方がよいわけですが、そうなると問題も起きます。
例えばソースファイルを更新してもそれをコンパイルし忘れたりするのです。このような問題を解決する便利な「make」というツールがあります。make は大抵の場合コンパイラを入手すればその中に含まれています。
この make はコンパイルの過程を自動的に再現するという単純なものではなく、更新されたファイルだけ再コンパイルしてくれるため最小の手間と時間で確実にコンパイル、リンクしてくれます。こんな便利なもの使わない手はないですね。では早速使い方をみてみましょう。
まず最初にしなければならないことは、make への指示を記述したファイル「makefile」を用意することです。この makefile の内容に従って make はコンパイルを行います。記述の仕方を具体的な例でみていきましょう。
いま、a.c b.c c.c の3つのソースファイルから実行ファイル prog.exe を作りたいとします。また、a.c と b.c は mydefs.h というヘッダファイルをインクルードしていて、 mydefs.h が変更されれば a.c b.c も再コンパイルしなければなりません。これらを make でコンパイルするためには次のように makefile に記述します。

# a.c , b.c , c.c から prog.exe をつくる
prog.exe : a.obj b.obj c.obj
   lcc -o prog.exe a.obj b.obj c.obj
a.obj : a.c mydefs.h
   lcc -c a.c
b.obj : b.c mydefs.h
   lcc -c b.c
c.obj : c.c
   lcc -c c.c

makefile は他のソースファイルと同じフォルダにおいて下さい。さて、これで準備完了です。MS-DOSプロンプト上で次のようにタイプして下さい。

make

これだけで自動的にコンパイル、リンクが行われエラーがなければ prog.exe ができあがります。もしここで c.c だけを更新して make すれば c.c だけコンパイルされリンクが行われるでしょう。
さて、makefile の中身について説明します。まず、# で始まる行はコメントです。次の2行で一つの固まりです。この固まりはこのようになっています。

 ターゲット : ソース1 ... ソースn
  コマンド

『「ターゲット」は「ソース1 ... ソースn」から作られる。その方法は「コマンド」である。』という形式になっています。2,3行目に当てはめると『prog.exe は a.obj b.obj c.obj から作られる。その方法は lcc -o prog.exe a.obj b.obj c.obj である。』ということになるわけですね。
このようにソース、ターゲット、コマンドを指示すれば make が必要なものを適切な順番に処理してくれるわけです。これが makefile の一番基本的な記述例です。
make はいくつかのファイル拡張子を理解するので、分かり切っているコンパイルの処理に関する記述を省略することができます。このことを利用すると上の例は次のようになります。

# a.c , b.c , c.c から prog.exe をつくる(省略した場合)
prog.exe : a.obj b.obj c.obj
   lcc -o prog.exe a.obj b.obj c.obj
a.obj b.obj : mydefs.h

a.obj b.obj c.obj をコンパイルする手順が省略されていますね。make はこのようなとき、フォルダの中に a.c b.c c.c があるかどうかを調べ、もしあれば「lcc -c a.c」のようなコマンドを自動的に追加します。
「a.obj b.obj : mydefs.h」の行は a.obj,b.obj つまり a.c,b.c が mydefs.h の更新を反映させることを認識させるために省略はできません。

 [ 例 ] makeをつかってプログラムを作る例  maketest.c + 3 filesGet! ソースファイル


○ソースファイルのダウンロード○
この章に使った例のソースファイルを1つにまとめて圧縮してあります。
 【中に含まれているソースファイル】
  ex7-1.c maketest.c

ソースファイルのダウンロードexample07.lzh (2,230 Bytes)

今回は内容的に難しいところが多かったと思いますが、実用的な面で考えると覚えておいて損はありません。特にプリプロセッサの機能はこれからも必ずといっていいほど使うのでしっかりマスターしましょう。


Jump to Phase #07-2Phase #07-2: コンパイルの過程(2) へ
Phase #08-1: 変数の記憶クラス(1) へJump to Phase #08-1

△戻る
▲トップに戻る