web-dev-qa-db-ja.com

.oファイルと.aファイル

これら2つのファイルタイプの違いは何ですか。実行可能ファイルの構築中に、私のC++アプリが両方のタイプにリンクしているのがわかります。

.aファイルをビルドする方法は?リンク、参照、特に例は高く評価されています。

54
Sasha

.oファイルはオブジェクトです。これらはコンパイラの出力であり、リンカー/ライブラリアンへの入力です。

.aファイルはアーカイブです。これらは、オブジェクトまたは静的ライブラリのグループであり、リンカーへの入力でもあります。

追加コンテンツ

あなたの質問の「例」の部分には気づきませんでした。通常、静的ライブラリを生成するにはmakefileを使用します。

AR = ar 
CC = gcc

objects := hello.o world.o

libby.a: $(objects)
    $(AR) rcu $@ $(objects)

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

これにより、hello.cおよびworld.cがオブジェクトにコンパイルされ、ライブラリにアーカイブされます。プラットフォームによっては、アーカイブに目次を生成するためにranlibというユーティリティを実行する必要がある場合もあります。

興味深い補足事項:.aファイルは技術的にはアーカイブファイルであり、ライブラリではありません。はるかに古いファイル形式を使用していますが、圧縮なしのZipファイルに似ています。 ranlibのようなユーティリティによって生成される目次は、アーカイブをライブラリにするものです。 Javaアーカイブファイル(.jar)は、Javaアーカイバによって作成された特別なディレクトリ構造を持つZipファイルであるという点で似ています。

58
D.Shawley

.oファイルは、単一のコンパイル単位(基本的には、関連するヘッダーファイルを持つソースコードファイル)をコンパイルした結果ですが、.aファイルは、ライブラリとしてパッケージ化された1つ以上の.oファイルです。

14
Vatine

D Shawleyの回答は良いです。他の回答は何が起こっているかについての不完全な理解を反映しているので、私はいくつかのポイントを追加したかっただけです。

アーカイブファイル(.a)は、オブジェクトファイル(.o)の格納に限定されないことに注意してください。これらには任意のファイルが含まれている可能性があります。あまり役に立ちませんが、愚かなリンカーのトリックについては アーカイブに埋め込まれた動的リンカー依存情報 を参照してください。

また、オブジェクトファイル(.o)は必ずしも1つのコンパイル単位の結果ではないことに注意してください。複数の小さいオブジェクトファイルを1つの大きいファイルに部分的にリンクすることができます。

http://www.mihaiu.name/2002/library_development_linux/ -このページで「部分的」を検索

11
bstpierre

arを使用して、.aファイル(オブジェクトファイル)から.oファイル(静的ライブラリ)を作成できます。

詳細については、man arをご覧ください。

5
qrdl

.aファイルは、複数のオブジェクトファイルを含むことができるアーカイブだと思います。

2
Dana Holt