1

ここで何かを誤解しているようです。クライアントが使用するためにエクスポートされたいくつかの C++ クラスを持つ DLL (DLL_1 など) があります。

静的ライブラリは、これらのエクスポートされたクラス (SLib_1 など) を使用します。

前述のスタティック ライブラリのみに依存するため、SLib_1 にリンクするDLL (DLL_Client など) がもう 1 つあります。ので、私は持っています:

DLL_Client ==> SLib_1 ==> DLL_1

SLib_1 のビルド中に、リンカーは DLL_1 からエクスポートされたクラスを解決しますか? その部分は、DLL_Client がビルドされているときにのみ発生しますか?

上記の回答に応じて、別の質問があります。SLib_2 など、さらに別の静的ライブラリがあるとします。上記の依存関係パスを次のように再描画すると:

DLL_Client ==> SLib_2 ==> SLib_1 ==> DLL_1 (各モジュールは、それに続くモジュールのみを認識してリンクします)

DLL_1 によってエクスポートされたシンボルを DLL_Client に表示する必要がありますか? このセットアップ全体をコンパイル/リンクしている間、問題はありません。私の問題は実行時にのみ発生します。つまり、Dependency Walker を使用して DLL_Client をロードすると、DLL_1 でエクスポートされた関数を解決できないというエラーが表示されることがわかりました。

何を与える?

4

1 に答える 1

1

最初の質問に対して、静的ライブラリは単なるオブジェクト ファイルのコレクションです。スタティック ライブラリをビルドしても何も解決されません (実際、ヘッダーがあればコンパイルできるので、他のコードがまだ存在していなくてもスタティック ライブラリをビルドできます)。スタティック ライブラリの依存関係は、これらのオブジェクト ファイルを DLL にリンクする場合にのみ解決されます。

2 番目の質問については、短い答えはノーです。静的ライブラリが別のライブラリ (静的または動的) に依存している場合、静的ライブラリは、依存するライブラリのシンボルを最終ユーザーに表示するために何もしません。これは、オブジェクト ファイルの単なるコレクションであるという事実に戻ります。通常、オブジェクト ファイルをライブラリに配置しても、シンボルの可視性などについては何も変わりません。

つまり、DLL_Client が SLib_2 の関数を必要とし、DLL_1の関数直接使用する場合、SLib_2.lib と DLL_1.lib の両方にリンクする必要があります。


1誰かがそれらを持ち出さないように、私は、ライブラリには、弱いエクスターナルなど、やや...特別な可視性を持ついくつかのシンボルが含まれていることが多いことを付け加えておきます。ここでも、それらを特別なものにするのは、それらをライブラリに入れることではありません。ライブラリに何かを入れるときは、それらの特別な可視性オプションが本当に必要または有用である唯一のときです.

于 2012-12-05T04:01:20.040 に答える