2017-12-16 23 views
1

私の同僚は、昨日、libfoo.aをビルドするには、その関数を定義する必要はありません。リンクする実行可能ファイルを構築していれば、 未定義の参照を持つライブラリアーカイブを構築する

彼はオブジェクトファイルが未定義の参照を構築することができるので、アーカイブがインデックスを持つオブジェクトファイルの収集のみで、と言った。..行方不明参照することを規定し、そうすることができますアーカイブ..

これは本当ですか?もしそうなら、これは、リンクの段階でのみ参照解決が実行されることを暗示していますか(つまり、編集やアーカイブは行われません)。

どうもありがとう..コンパイラは、言語がはい、すべてのことは完全に真であるC/C++

答えて

1

である、方法によってはgccです。あなたはlibfoo.aarアーカイブであることを知っているようです。 arはGNU 汎用アーカイバです。ドキュメント、画像、音楽のコンテンツの をオブジェクトのコレクションとしてアーカイブすることは非常にうれしいです ファイル。

外部シンボル解像度はリンケージです:リンケージのコア事業で、リンケージ はリンカでのみ行われます。 arがアーカイブ内のオブジェクトファイルの外部シンボル参照を解決するはずであれば、ar, リンカーのように、シンボル定義を検索する に外部ライブラリを指定するコマンドオプションが必要です。これらのライブラリが検索されるのは です。それは一切ありません。

arアーカイブをリンカ入力ファイルとして使用できます。この場合、リンカーは、既に消費されたオブジェクトファイルから発生した未解決の シンボル参照の定義を提供するオブジェクトファイルを、アーカイブ内で で検索します。 は、他の種類のファイルはアーカイブにありません。または にはオブジェクトファイルがありません。未解決の参照を定義するオブジェクトファイルが見つかった場合は、アーカイブから を抽出し、コマンドラインで個別に を指定した場合とまったく同じようにリンクに追加します。したがって、リンケージのアーカイブの の唯一の役割は、リンカーが1つを選択できるオブジェクトファイルの袋としてです。 それは継続する必要があります。

リンカを提供するための適切なバッグがわかっている場合は、 というリンケージが必要なオブジェクトファイルを正確に知ることが困難です。静的ライブラリの有用性は、 です。原則として、任意のアーカイブ形式が採用されている可能性があります(.tar.gz ...)しかし、arは、 の最初のフィールドであり、望ましくない機能(ディレクトリのシリアル化、圧縮など)を負わず、歴史の選択肢でした。 Microsoft LIB形式は、偶然にもar形式と同じです。

リンカのサービスでこの役割を果たすために、GNU arは、オブジェクトファイルの存在について少し を特化しています。オプションはデフォルトであり、 Sで上書き可能です。ファイルに空のファイル名とデータを持つ偽の "ファイル"をリンカが任意のオブジェクトファイルで定義されたグローバルシンボルからルックアップテーブルとして読み取ることができるようにしますそれらのオブジェクトファイルの名前と位置を にアーカイブします。以前は (そしてarの非GNU版)では、別の プログラム、アーカイブにranlibを実行してこのkludgeを適用し、リンカーがアクセスできるようにしました。 ranlibテーブルを挿入することで、リンカーはアーカイブから必要なオブジェクトファイルを選択できます。 これらのオブジェクトファイルで使用される未定義の参照は、リンカーが へのもので、後で使用されるオブジェクトファイルまたはライブラリからいつものように解決されます。

あなたの質問の文言は、あなたが "アーカイブ"と言う印象の下にあるかもしれないことを示唆しています - libfoo.a - GCCのフロントエンド(gccg++gfortranなど)を介して、コンパイル とリンケージのように、呼び出すことができるプロセスの1つです。これは ではありません。それらのフロントエンドは、プリプロセッサ、コンパイラ、アセンブラ およびリンカのみ(1つまたは複数)を呼び出します。アーカイブはリンカにオブジェクトファイルに を提供するための補助利便性であり、arで素直に作成されます。これが行われると

ar cr libfoo.a file.o... 

libfoo.a内の未定義の参照は、正確にfile.o ...内 未定義の参照です。