.o
ファイルはオブジェクトです。これらはコンパイラの出力であり、リンカー/ライブラリアンへの入力です。
.a
ファイルはアーカイブです。それらはオブジェクトまたは静的ライブラリのグループであり、リンカーへの入力でもあります。
追加コンテンツ
あなたの質問の「例」の部分に気づきませんでした。一般に、makefile を使用してスタティック ライブラリを生成します。
AR = ar
CC = gcc
objects := hello.o world.o
libby.a: $(objects)
$(AR) rcu [email protected] $(objects)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o [email protected]
これは hello.c
をコンパイルします と world.c
オブジェクトに変換し、ライブラリにアーカイブします。プラットフォームによっては、ranlib
というユーティリティも実行する必要がある場合があります。 アーカイブの目次を生成します。
興味深い補足:.a
ファイルは技術的にアーカイブ ファイルです ライブラリではありません。はるかに古いファイル形式を使用しますが、圧縮なしの zip ファイルに似ています。 ranlib
などのユーティリティによって生成された目次 アーカイブを ライブラリ にするのは . Java アーカイブ ファイル (.jar
) は、Java アーカイバによって作成された特別なディレクトリ構造を持つ zip ファイルであるという点で似ています。
.o ファイルは単一のコンパイル ユニット (基本的には関連するヘッダー ファイルを含むソース コード ファイル) をコンパイルした結果であり、.a ファイルはライブラリとしてパッケージ化された 1 つ以上の .o ファイルです。
D Shawley の回答は良いです。他の回答は何が起こっているのかについての不完全な理解を反映しているため、いくつかの点を追加したかっただけです。
アーカイブ ファイル (.a) は、オブジェクト ファイル (.o) を含むものに限定されないことに注意してください。任意のファイルが含まれている可能性があります。あまり役に立ちませんが、アーカイブに埋め込まれた動的リンカーの依存関係情報を参照して、ばかげたリンカーのトリックを確認してください。
また、オブジェクト ファイル (.o) は、必ずしも単一のコンパイル ユニットの結果ではないことに注意してください。いくつかの小さなオブジェクト ファイルを 1 つの大きなファイルに部分的にリンクすることができます。
http://www.mihaiu.name/2002/library_development_linux/ -- このページで「部分的」を検索