9

ライブラリ内で複数のオブジェクト ファイルを結合することは一般的ですが、(少なくとも Linux では) 複数のオブジェクト ファイルを別のオブジェクト ファイルに結合することができます。

( GCC でコンパイルされた 2 つの .o オブジェクト ファイルを 3 つ目の .o ファイルに結合するを参照してください)

結合されたオブジェクト ファイルの代わりにライブラリを使用することには、次のような欠点があります。

1: 特にすべてのファイルが同じことを行う場合は、リンク時に 1 種類のファイル (オブジェクト) のみを使用する方が簡単です。

2: (少なくとも GCC では) リンクするとき、ライブラリ (デフォルト) は順序付けされる必要があり、循環依存関係を処理できません。

ライブラリにはどのような利点があるのか​​ を知りたいです(キャッチ22を除いて、それらはよく使用されます)。

しばらく検索した後、私が得た唯一の説明は、単一のライブラリが複数のオブジェクト ファイルよりも優れているということです。

4

4 に答える 4

10

使用しているリンカにもよりますが、オブジェクト ファイルは最終的なバイナリに完全に含まれています。そのため、複数のオブジェクト ファイルを 1 つのオブジェクト ファイルに結合すると、結果の (結合された) オブジェクト ファイルが結果のバイナリに含まれます。

対照的に、ライブラリはまさにオブジェクトファイルのライブラリです。リンカーは、すべてのシンボリック リンクを解決するために必要なオブジェクト ファイルのみをライブラリから取得します。オブジェクト ファイル (ライブラリ内) が不要な場合は、バイナリに含まれません。

于 2011-06-05T13:17:36.690 に答える
5

一般に、リンカーはライブラリ内の未使用の .o ファイルを最適化できるため、ライブラリの方が優れています。

何らかの方法でファイルを結合すると、いくつかの利点もあります。

  • すべてのソース ファイルを 1 つに結合すると、コンパイル速度が大幅に向上します。
  • C++ では、最適化されたくない .o ファイルがリンカーによって最適化されることがあります。たとえば、そこで定義されているが他の翻訳単位では使用されていないオブジェクトのコンストラクターの副作用が必要な場合などです。
于 2011-06-05T13:26:32.440 に答える
1

オブジェクト ファイルを使用する場合、オブジェクト ファイル内のすべてのコードがアプリケーションに配置されます。ライブラリを使用する場合は、必要なコードのみです。

于 2011-06-05T13:18:06.297 に答える
0

理由の 1 つは、ライブラリ内のオブジェクトは、未定義.aのシンボル参照を満たすためにのみ取り込まれるためです。したがって、呼び出し元のアプリケーションがシンボルを定義したり、「ライブラリ」コードでデフォルトの定義を使用したりできるようにしたい場合は、それが可能です。単一のファイルではなく、実際のライブラリでこれを行うには。.o

于 2011-06-05T14:09:09.117 に答える