リンクして実行ファイルを生成する
リンクを行って実行ファイル生成する方法を解説します。リンクとは、コンパイルによって生成したオブジェクトファイルから、実行ファイルを生成することだと考えてください。リンクには、共有ライブラリを作成するなど、もう少し広い用途がありますが、ここでは、実行ファイルを作成するという基本をまず覚えましょう。
リンクを行うにはgccコマンドを使用します。引数にはオブジェクトファイルを指定します。
# リンクを行って実行ファイルを出力 gcc -o 出力ファイル名 オブジェクトファイル1 オブジェクトファイル2 オブジェトファイルn
main関数を含む「myapp.o」、自作ライブラリ「mylib1.o」「mylib2.o」から、実行ファイル「myapp」を生成するサンプルを書いてみます。
# リンクを行って実行ファイルを出力 gcc -o myapp myapp.o mylib1.o mylib2.o
実際に、ライブラリを作成して、分割コンパイルを行って、複数のオブジェクトファイルをリンクして、一つの実行ファイルを作成する方法は、別の記事で解説します。
コンパイルとリンクを一度に行うには?
コンパイルとリンクを一度に行い、プログラムを実行する方法については、以下で解説しています。
オブジェクトファイルと実行ファイルの違いは?
オブジェクトファイルも実行ファイルも機械語で書かれているという点については同じです。
オブジェクトファイルは、まだ実行ファイルとなっていないので、それ単体で実行することができません。
リンカはldじゃないの?
リンクをするためのリンカは「gcc」じゃなくって「ld」じゃないのという疑問がありますね。はい、リンカは「ld」で、これが「gcc」から呼び出されます。
リンクは具体的にはどのような処理なの?
詳しくは分割コンパイルを解説する場合に、記述しますが、リンクとは、簡単に書くと、オブジェクトファイルに記述されている関数名やグローバル変数名が他のオブジェクトファイルに含まれていることを確認して、結びつける作業のことです。
個々のオブジェクトファイルは、自分以外のオブジェクトファイルに存在するかどうかがわかっていない関数名やグローバル変数名を持っています。
名前の情報だけを持っており、プログラム上のアドレス位置がわかっていません。
リンクによって複数のオブジェクトファイルから実行ファイルを作成するということは、関数名やグローバル変数名などの名前を、プログラム上の実際のアドレスとして解決するということを意味しています。