みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

プログラミング

C言語のプログラミング歴1年くらいの者です。

LinuxのGCCを使ってプログラミングをやっている中で、オブジェクトファイルというものを知ったのですが、オブジェクトファイルってなんのためにあるんですか?

ネットで調べたり友達にきいたりして、「それ単体では動作はしないが、プログラムファイルとリンクさせてコンパイルすることで動作するもの」みたいなことまでは分かっています。

ただいまいちなぜオブジェクトファイルにする必要があるとかがわかりません。

どなたか教えてください。

投稿日時 - 2014-08-08 22:08:31

QNo.8709585

困ってます

質問者が選んだベストアンサー

ソースコードが書かれたソースファイルが1つしか無いプログラムなら「コンパイルしたら直に実行形式のプログラムファイルが出来上がる」でも良いですよね。

それだと「オブジェクトファイルなんか要らない」ですもんね。

しかし、それで済むのは「ソースファイルが1つだけ」の時だけです。

ソースファイルが3000ファイルあって、それら3000個から1つの実行ファイルが作られている場合を考えてみましょう。

「コンパイルしたら直に実行形式のプログラムファイルが出来上がる」のですから、どこか1箇所を書き換えたら、3000ファイルをすべてコンパイルしないと実行形式のプログラムファイルが作れません。

「全部コンパイルし直し」になっちゃいます。

なので「コンパイルはするけど、3000個のファイルを実行形式ファイルに組み立てないまま置いておく」って事をして、書き換えた物だけをコンパイルする事にしました。

そして「コンパイルだけして、実行形式ファイルに組み立てる前の状態を保存しておくファイル」を「オブジェクトファイル」と呼ぶ事にしました。

こうすると、書き換えたソースファイルだけコンパイルすれば、残り2999個はコンパイル済みなので、すぐに「組み立てて実行形式ファイルを作成可能」になります。

なお「ライブラリファイル」ってのは「便利な関数を、コンパイル済みのオブジェクトファイルにして、集めてある物」の事です。

便利なライブラリ関数がすぐ使えるのも「オブジェクトファイルという仕組みがあるから」です。

投稿日時 - 2014-08-11 13:45:40

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

規模の大きなプログラムでは少し修正するたびにソースファイルを
全部コンパイルしていたら非常に時間がかかります。
規模によっては数時間かかったりします。

必要なオブジェクトファイルだけ作り直してリンクするのは、
それよりはるかに短い時間で済みます。

Linux と gcc でプログラミングしているそうですが、
make コマンドは使用していないのでしょうか。
make コマンドを使用して差分ビルドするようになると、
オブジェクトファイルの有用性を感じるようになるのではないかと思います。

投稿日時 - 2014-08-11 23:02:30

ANo.5

追記。

「色んな言語で、オブジェクトファイルの形式が統一してある場合」には、Cで書いてコンパイルした物、COBOLで書いてコンパイルした物、Fortranで書いてコンパイルした物など、色々と混ぜて、1つのプログラムに組み立てる事も可能になります。

「複数のソースファイルに分割する」とか「他言語と組み合わせてプログラミングする」ってのを覚えると「オブジェクトファイルのアリガタミ」を痛感すると思います。

投稿日時 - 2014-08-11 13:53:46

ANo.3

zwi

殆ど既に書かれていますが、色んな物と結合することが便利だからです。
それがライブラリ(これもオブジェクトファイルの一種)であったり、アセンブラなどの他言語で作成されたオブジェクトファイルだったり、自分の作った別ソースファイルのオブジェクトファイルだったりします。
全部自分でコンパイルしたら1日で終わらないようなものもありますので、それらが一瞬で自分のプログラムにリンカで結合されるのです。便利でしょう。

投稿日時 - 2014-08-08 23:45:16

ANo.2

複数のソースプログラムファイルから1つのプログラムを作る場合、
ソースファイル1→オブジェクトファイル1 (コンパイル)
ソースファイル2→オブジェクトファイル2
・・・・・・・
ソースファイルN→オブジェクトファイルN
オブジェクトファイル1+オブジェクトファイル2+・・・・+オブジェクトファイルN+ライブラリファイル群→実行ファイルA (リンク)
となります。

ソースファイル1だけを修正した場合、
ソースファイル1→オブジェクトファイル1
のコンパイルと、リンクだけをやり直せばOKですが、オブジェクトファイルを保存しておかないと、こういう場合でも他の全部のソースファイルのコンパイルをやり直す必要があるため時間がかかります。

また、
オブジェクトファイル1+オブジェクトファイル2+オブジェクトファイルX+ライブラリファイル群→実行ファイルB
のような実行ファイルBを別途作りたくなった場合に、ソースファイルXだけコンパイルすれば実行ファイルBがリンクできます。

投稿日時 - 2014-08-08 23:01:57

ANo.1

言語というのはいろいろありますよね。
C,PLI,PHP,javaなど。

言語で書いたものを共通のobjを作り、Linkすることで1つの実行ファイルにするのです。
これによって部分部分でふさわしい言語で開発することができます。

投稿日時 - 2014-08-08 22:16:33

あなたにオススメの質問