違いは何ですか .a
.o
および.lo
Cのファイル?
「。lo」ファイルはライブラリオブジェクトです 、これは共有ライブラリに組み込むことができ、「。o」ファイルは標準オブジェクトファイルです
。loファイルはlibtoolオブジェクトです 、Libtoolが共有ライブラリに組み込むことができるオブジェクトファイルを決定するために使用します
注:
上記の回答は気に入っていますが、.a/archiveライブラリフォームには対応していません。したがって、ここでは、3つのすべてに対処するために、.soライブラリ形式も追加するというボーナスを提供します。また、stackexchangeの流れで、リンクが壊れた場合に備えて、より多くのテキストを使用します(このリンクの参照リンクは必要なかったことに注意してください)。
。oファイルをコンパイルする場合、ターゲットプラットフォーム用のコンパイラが出力するオブジェクトコードを含むオブジェクトファイルです。 。oファイルを作成するには:
gcc -c filename.c <==== creates filename.o
この例では、位置独立コード(PIC)は作成されていません。これは、静的ライブラリまたは実行可能ファイルに含めることができるオブジェクトと見なされます。つまり、実行可能ファイルを。oファイルにリンクすると、.oファイル内のコードが実行可能ファイルに挿入されます---ではなく、ビルド時にバインドされます実行時間。つまり、.oファイルを含めずに実行可能ファイルを再配布できます。警告:。oファイルは非PICと見なされるのが慣例です。通常、PICオブジェクトファイルには。lo拡張子を付けます。
。aファイルタイプは "archive"ライブラリです。 1つ以上の.oファイルが含まれており、通常は静的な実行可能ファイルの作成に使用されます。
arコマンドを使用して、アーカイブライブラリを操作します。以下の例では、(1)。oファイルからアーカイブライブラリを作成し、(2)1つのコンテンツをリストします。
ライブラリの作成
$ ls *.o
a.o b.o c.o <=== the files going in the archive
$ ar q libmyStuff.a *.o <=== put *.o files in an archive (or new one)
ar: creating libmyStuff.a
$ ls *.a <=== just show the library created
libmyStuff.a
アーカイブライブラリの内容を表示する
$ ar t libmyStuff.a
a.o
b.o
c.o
。loの使用は、位置に依存しないオブジェクトファイルによく使用される規則です。現在のディレクトリでlibtool compileコマンドは。loファイルと。oファイル、PICコードあり、PICコードなし。以下の出力を参照してください。
$ libtool compile gcc -c a.c
libtool: compile: gcc -c a.c -fPIC -DPIC -o .libs/a.o <== PIC code
libtool: compile: gcc -c a.c -o a.o >/dev/null 2>&1 <== Not-PIC code
$ ls a.lo a.o
a.lo a.o <=== a.lo contains the PIC code.
また、。libsサブディレクトリがa.oで作成されたことにも注意してください。このファイルは、名前にもかかわらず、PICコードです。 Libtoolはこのファイルを現在のディレクトリに移動し、拡張子を。loに変更しました。
コンパイル時にgccにPICオプションを使用するだけで、いつでも手動で。loファイルを作成できます。結果の。oファイルを。lo拡張子に移動します。
慣例により、.soは「共有オブジェクト」ライブラリファイルを意味します。 PICオブジェクトファイルを共有ライブラリに配置します。 。oおよび。aファイルとの契約では、。so結果のコンパイル済みファイルにコードが含まれていないファイル。つまり、ランタイムバインディングを使用します(。loの場合)。ランタイムバインディングには複数の形式がありますが、ここでは説明しません。
.lo
ファイルは、共有ライブラリに組み込むことができるライブラリオブジェクトであり、.o
ファイルは標準オブジェクトファイルです。詳細: libtool共有ライブラリ(.loファイル)をインストールして使用するには?