である、方法によってはgccです。あなたはlibfoo.a
がar
アーカイブであることを知っているようです。 ar
はGNU 汎用アーカイバです。ドキュメント、画像、音楽のコンテンツの をオブジェクトのコレクションとしてアーカイブすることは非常にうれしいです ファイル。
外部シンボル解像度はリンケージです:リンケージのコア事業で、リンケージ はリンカでのみ行われます。 ar
がアーカイブ内のオブジェクトファイルの外部シンボル参照を解決するはずであれば、ar
, リンカーのように、シンボル定義を検索する に外部ライブラリを指定するコマンドオプションが必要です。これらのライブラリが検索されるのは です。それは一切ありません。
ar
アーカイブをリンカ入力ファイルとして使用できます。この場合、リンカーは、既に消費されたオブジェクトファイルから発生した未解決の シンボル参照の定義を提供するオブジェクトファイルを、アーカイブ内で で検索します。 は、他の種類のファイルはアーカイブにありません。または にはオブジェクトファイルがありません。未解決の参照を定義するオブジェクトファイルが見つかった場合は、アーカイブから を抽出し、コマンドラインで個別に を指定した場合とまったく同じようにリンクに追加します。したがって、リンケージのアーカイブの の唯一の役割は、リンカーが1つを選択できるオブジェクトファイルの袋としてです。 それは継続する必要があります。
リンカを提供するための適切なバッグがわかっている場合は、 というリンケージが必要なオブジェクトファイルを正確に知ることが困難です。静的ライブラリの有用性は、 です。原則として、任意のアーカイブ形式が採用されている可能性があります(.tar
、.gz
...)しかし、ar
は、 の最初のフィールドであり、望ましくない機能(ディレクトリのシリアル化、圧縮など)を負わず、歴史の選択肢でした。 Microsoft LIB
形式は、偶然にもar
形式と同じです。
リンカのサービスでこの役割を果たすために、GNU ar
は、オブジェクトファイルの存在について少し を特化しています。オプションはデフォルトであり、 S
で上書き可能です。ファイルに空のファイル名とデータを持つ偽の "ファイル"をリンカが任意のオブジェクトファイルで定義されたグローバルシンボルからルックアップテーブルとして読み取ることができるようにしますそれらのオブジェクトファイルの名前と位置を にアーカイブします。以前は (そしてar
の非GNU版)では、別の プログラム、アーカイブにranlib
を実行してこのkludgeを適用し、リンカーがアクセスできるようにしました。 ranlibテーブルを挿入することで、リンカーはアーカイブから必要なオブジェクトファイルを選択できます。 これらのオブジェクトファイルで使用される未定義の参照は、リンカーが へのもので、後で使用されるオブジェクトファイルまたはライブラリからいつものように解決されます。
あなたの質問の文言は、あなたが "アーカイブ"と言う印象の下にあるかもしれないことを示唆しています - libfoo.a
- GCCのフロントエンド(gcc
、g++
、gfortran
など)を介して、コンパイル とリンケージのように、呼び出すことができるプロセスの1つです。これは ではありません。それらのフロントエンドは、プリプロセッサ、コンパイラ、アセンブラ およびリンカのみ(1つまたは複数)を呼び出します。アーカイブはリンカにオブジェクトファイルに を提供するための補助利便性であり、ar
で素直に作成されます。これが行われると
ar cr libfoo.a file.o...
、libfoo.a
内の未定義の参照は、正確にfile.o ...
内 未定義の参照です。