2015年6月23日火曜日

C言語でgccを使ったコンパイル② インクルードとリンクについて基礎知識

GCCは何をしているのか?

作ったコードをコンパイルしてくれるgccというコマンド。

実際にはこのコマンド自体がコンパイルを行っているわけではなく、
内部で他のコマンドを呼び出して処理を行っている。
 gccコマンドは呼び出し屋さん gccコマンドの裏側
 コンパイラは何をしているのか

C言語の場合ではをgccを実行すると
 ccp プリプロセッサ
 cc1 アセンブリコードへ変換(C++ではcc1plus)
 as マシン語へ変換
 ld リンク処理
といった処理を経て実行ファイルが完成。


※コンパイルに使うコマンドでmakeというのもあるが、
こちらはMakefileの情報を素にソースファイルを組み合わせてコンパイルする。
その処理の中にgccのコマンドが利用されていたりする。


最初にC言語の標準ライブラリのみを使った単純なコードを作って遊んでいた時点ではあまり意識していなかった。
しかし、ソースファイルを分割した場合や、Gtk+やSDLといったライブラリを必要とするコードをコンパイルしようとすると少々ややこしくなる。
インクルードとリンクを処理するためにgccのコマンドに長い引数が必要となるからだ。

インクルードとは?

includeは「含める」という意味。
プリプロセッサによってその場に展開されてコードの一部として扱われる。
第27章 インクルード


C言語のコード中では先頭部分に
 #include <stdio.h>
 #include "xxxx.h"
のように書かれており、ヘッダファイルと呼ばれる。
ヘッダファイルには関数や変数の宣言が含まれており、これをインクルードすればそれら関数等を利用できるようになる。(関数の本体は別のファイルであるライブラリに含まれている。)
これにより、よく利用される処理を簡単に何度も使うことができ、ソースファイルの中身もスッキリとさせることができる。

例えば、C言語でよく利用される関数は予めC言語の標準ライブラリに定義されている。
printfやscanfといった文字の入出力を行う関数は予めインクルードしなければ利用することができず、stdio.hをインクルードすることで使えるようになる。

また、gccコマンドで引数なしで参照されるディレクトリは限られているので、それ以外の場所にあるものについては指定する必要がある。


リンク処理とは?

コンパイルされたオブジェクトファイルを組み合わせる処理。
ヘッダファイル中で参照されているライブラリや、分割作成したモジュール等を結合して実行可能なファイルを作る。

コンパイルとリンク
externとモジュール
C言語でヘッダファイルstdio.hのなかに・・・



そんなわけで・・・
自動で認識してくれるディレクトリ以外にあるヘッダファイルをインクルードする場合や、ライブラリをリンクする場合、どこを探せばそれがあるのかをgccに教えてやらなければならない。

実際のコンパイル時の引数は別記事にて。

0 件のコメント:

コメントを投稿