.a
ライブラリは「静的オブジェクト」ではありません。 .a
ファイルは、理論上はtar
と似ていますが、異なるフォーマットであり、ar
コマンドで生成されたアーカイブです。アーカイブ内の各オブジェクトは個別で個別です。通常、これらのオブジェクトはコンパイルされたリンクされていないオブジェクトである.o
ファイルです。それらの.o
ファイルのいずれかに含まれるすべてのシンボルは、リンク中に別のファイルに含まれます(ld
)。ただし、リンク中にアーカイブ内のオブジェクトがすべて必要なわけではない場合、他のオブジェクトファイルのシンボルはリンクされたファイルには表示されません。
たとえば、libdialog.a
には、mouse.o
とcolumns.o
のオブジェクトファイルがあります。プログラムでは列は使用されますが、マウス機能は使用されません。したがって、プログラムにはすべてのシンボルがcolumns.o
に含まれていますが、mouse.o
のシンボルは含まれていません。
"共有オブジェクト"(.so
)の場合、それは単一のオブジェクトです。そのため、オブジェクトとのリンクには、オブジェクト内のすべてのシンボルが必要かどうかが含まれます。上記の例では、libdialog.so
とリンクした場合、マウスベースのコードは使用されていませんが、columns.o
とmouse.o
の両方のシンボルがプログラムに含まれます。
共有オブジェクト(.so
)を生成する場合、アーカイブ(.a
)の使用時に同じリンケージルールが適用されます。したがって、.so
ファイルには、使用されているアーカイブ内のファイル.o
のシンボルのみが含まれます。
ご清聴ありがとうございます。しかし、私のシナリオでは、barは何も使わないので、バーは '.so'に含まれていないシンボルを探しているのはなぜですか? – notlesh
コードを見ることなく、私はそれに答えることができません。リンカ( 'ld')は、解決する必要のあるシンボルを見て、そのシンボルを持つライブラリ(' .a'や '.so')やオブジェクトファイルを探します。次に取るべきことは、 'libbaz.so'(' bas.o'など)に入るオブジェクトファイルで、どのシンボルを解決する必要があるのか( 'nm -g')を調べることです。 – Arcege