1.3開発環境(その1) UNIXはプログラムの開発に多く利用されてきたため,標準で数多くのプログラム開発ツールが備わっています.Linuxでは,プログラム開発にはGNUプロジェクトで開発されたツールが使われています.ここでは,gccやGNUmakeなどの代表的なプログラム開発ツールについて説明します. gcc GNUプロジェクトで開発されたCコンパイラですが,現在ではC++とObjective-Cのコンパイラも統合化されています.gccでhello.cというプログラムをコンパイルする際には次のようにします. $ gcc hello.c コンパイルが実行・完了すると,カレントディレクトリにa.outというファイルが作成されます.gccはデフォルトでa.outという名前のファイルにコンパイルした結果を出力します.a.outはそのまま実行できるファイルなので, $ ./a.out として実行できます.a.out以外の名前にするには“-o”オプションを使い, $ gcc -o hello hello.c とすると,“hello”というファイルにコンパイルした結果を出力します. Cコンパイラの構成 gccコマンドで実行可能ファイルを生成することができるのですが,実際にどのような流れで実行可能ファイルができるのか,ここで少し見てみます.UNIXのCコンパイラが,すべてのC処理系の元になっているので,ほかのOSであっても,同じ処理が継承されている処理系も多くあります.本書の読者のほとんどはC言語を使ったことがあるでしょうから,ここでは簡単に説明するにとどめます. Cプログラムは,まずcppというプリプロセッサで処理されます.include文やdefine文など,#で始まる行はcppで処理されます.cppで処理された結果は,cc1というCコンパイラの本体に渡されます.cc1はCプログラムをアセンブリ言語に翻訳し,アセンブリ言語になったプログラムはasへ渡されます.このasによって,使用しているマシンに合わせた機械語に翻訳されます.通常,asの出力がオブジェクトファイルと呼ばれます. オブジェクトファイルは,ldへ受け渡され,libcなどの必要なライブラリとリンクされ実行可能なファイルが作成されます.Linuxではシェアードライブラリが標準的に使われますから,リンクの処理はライブラリから必要な情報を取り出すだけでオブジェクト自体はリンクされません. オプション
make(その1) UNIX上でのプログラム開発に欠かせないツールがmakeです.プログラムが一つのファイルからできていれば簡単ですが,複数のファイルから成り立つ場合にはどのファイルを修正したか,どのファイルを再コンパイルしなければならないかなど,面倒なことが起きてきます. 常にすべてのファイルを再コンパイルすれば安心ですが,それでは効率が悪くなります.makeはプログラムを作成する手順にしたがって必要最低限の作業を行い,プログラムの最新版を作成します(図14).シェルを用いても同様のことができますが,makeのほうがはるかにスマートに実現できます. 規則を書く makeはカレントディレクトリのmakefile,またはMakefileからプログラムを作成する規則を読み込みます.規則は以下のように書きます.コマンドの行は行頭にタブが必要なので,この点に注意してください.コマンド行は1行ごとにシェルへ渡されて実行されます. ターゲット : 依存するファイル コマンド 依存するファイルがターゲットよりも新しければ,コマンド行は1行ごとにシェルへ渡されて実行されます. もし,hello.cがhello.hをインクルードしているとすると,Makefileは次のようになります. $ cat Makefile hello : hello. gcc -o hello hello.o hello.o : hello.c hello.h gcc -c hello.c このMakefileには二つの規則が書かれています. まず,helloというファイルがhello.oに依存していることを示し,hello.oが変更されたならば(helloよりも変更された日付が新しいとき),ccコマンドでhelloを作成するというものです. そして二つめの規則は,hello.oがhello.cとhello.hに依存していて,いずれかが変更されたときはccコマンドでhello.oを作成するというものです. makeは,引き数で作成したいMakefieのターゲットを指定しますが,引き数がないときはMakefileに最初に現れたターゲットを作成します. プログラムの変更に対して,最新のものにビルドし直すときには,単純に, $ make と入力します. Copyright 2000
|
|
Copyright 1997-2001 CQ Publishing Co.,Ltd.