web-dev-qa-db-ja.com

静的ライブラリはどのように依存関係にリンクしますか?

私がlibAを持っているとしましょう。 libAの非インラインメソッドがlibSomething.hのメソッドを呼び出すという単純な事実は、たとえばlibSomethingに依存します。この場合、依存関係はどのようにリンクしますか? libAはコンパイル時にlibSomethingに静的にリンクする必要がありますか、それともlibA(libAを使用するアプリケーション)のユーザーはlibAとlibSomethingの両方にリンクする必要がありますか?

ありがとう

19
jmasterx

静的リンクとは、アイテム全体(関数、定数など)を結果の実行可能ファイルにコピーすることです。静的ライブラリのコードにいくつかの共有ライブラリアイテムへの参照が含まれている場合、これらの参照は結果の実行可能ファイルの依存関係になります。実行可能ファイルの代わりにライブラリをリンクする場合も同様です。

このスレッド Linuxでどのように発生するかについて説明します。

14
vines

静的ライブラリは、リンクされていないバイナリオブジェクトファイル(* .oまたは* .obj)の多かれ少なかれ単純なアーカイブであり、アーカイブをコンパイルするときに、依存関係のチェックは行われません。バイナリ実行可能ファイル(または共有ライブラリ/ DLL)をリンクすると、リンカは必要なすべての依存関係をチェックし、問題が発生した場合にのみ警告を発します。

6
doron

ビルドプロセス中に、コンパイラはコードを一時的な形式に変換します。これをオブジェクトファイルと呼びましょう。オブジェクトファイルには、コンパイラが解決できなかったシンボルのリストがあります。通常は他の場所で定義されています。リンクフェーズは、これらのシンボルの解決を担当します。

ビルドプロセスは、すべてのシンボルが解決されるまでファイルをリンカーにフィードします。物理的な依存関係のリストはなく、解決するシンボルのリストだけです。これにより、さまざまなライブラリを使用してシンボルを解決できます。たとえば、Windows固有の問題にWindowsライブラリを使用したい場合があります。 Linux固有の問題のためのLinuxライブラリ。これは、プログラムがWindowsライブラリに依存していることを明示的に示しているわけではありません。 Linuxのものにも依存している可能性があります。

一部のコンパイラは、通常、ビルドプロセスで使用するために、依存関係リストを生成できます。ただし、最終的な責任はプログラマーにあります。

4
Thomas Matthews