これら2つのファイルタイプの違いは何ですか?実行可能ファイルの構築中に、私のC++アプリケーションが両方のタイプにリンクしているのが分かります。.oファイルと.aファイル
.aファイルをビルドする方法は?リンク、参考文献、特に例が高く評価されています。
これら2つのファイルタイプの違いは何ですか?実行可能ファイルの構築中に、私のC++アプリケーションが両方のタイプにリンクしているのが分かります。.oファイルと.aファイル
.aファイルをビルドする方法は?リンク、参考文献、特に例が高く評価されています。
.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ファイルである点で似ています。
私は、.aファイルは複数のオブジェクトファイルを含むことができるアーカイブだと思います。
.oファイルは、単一のコンパイル単位(基本的にソースファイルと関連するヘッダーファイル)をコンパイルした結果であり、.aファイルはライブラリとしてパッケージ化された1つ以上の.oファイルです。
あなたは.o
ファイル(オブジェクトファイル)詳細については、
を参照してくださいman ar
から.a
ファイル(静的ライブラリ)を作成するためにar
を使用することができます。
D Shawleyの答えは良いですが、他の回答は何が起こっているのか不完全な理解を反映しているため、いくつかの点を追加したかっただけです。
アーカイブファイル(.a)には、オブジェクトファイル(.o)が含まれているだけではありません。それらは任意のファイルを含むかもしれません。便利ではありませんが、愚かなリンカーのトリックについてはdynamic linker dependenciy info embedded in an archiveを参照してください。
オブジェクトファイル(.o)は必ずしも単一のコンパイル単位の結果であるとは限りません。複数の小さなオブジェクトファイルを部分的に1つの大きなファイルに部分的にリンクすることは可能です。
http://www.mihaiu.name/2002/library_development_linux/ - このページ内の検索が
「部分的」のためにこれはメイクの対象にですが、ちょうど私が追加しようと思いました、あなたはまた、レシピライン( '$に' '$(オブジェクト)置き換えることができます'$ <'または '$ ^'を使って 'libby.a'ターゲットの(AR)rcu $ @ $(objects)')にそれぞれ最初のターゲットまたはすべての前提条件ターゲットを参照します。これは同じ効果を持ちますが、 '$(objects)'を2回指定する冗長性を取り除き、変数名や前提条件が変更された場合は2箇所で参照を更新する必要があります。 –
@ShammelLee - '$ ^'はGNU Make拡張であり、[BSD make](https://www.freebsd.org/cgi/man.cgi?make(1))または[POSIX make](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html)を参照してください。ほとんどのLinuxディストリビューションはGNUベースですが、bashからダッシュへの '/ bin/sh 'の切り替えは、GNU固有の拡張を避け続けるのに十分でした。 –
お役立ち情報ありがとう。 –