C++ 静的ライブラリは共有ライブラリにリンクできますか?
-
12-09-2019 - |
質問
静的 C++ ライブラリ static.lib があり、C++ 共有ライブラリ (shared.lib) からいくつかの関数を呼び出したいとします。出来ますか?
次に、別の共有ライブラリ、たとえば static.lib にリンクするがshared.lib にはリンクしないshared2.libがあるとします。この場合、リンカーは自動的にshared2.libをshared.libにリンクしますか?
Microsoft Visual Studio 2003 を使用しています。
解決
静的ライブラリはリンクされません。これらは、リンカーが必要なシンボルを見つけやすくするために、ライブラリ ファイル (tar/zip ファイルのようなもの) にまとめてアーカイブされる単なるオブジェクト ファイル (*.obj または *.o) のコレクションです。
静的ライブラリはコンパイルされるだけなので、定義されていない関数 (ヘッダー ファイルで宣言されているだけ) を呼び出すことができます。次に、静的ライブラリを使用する exe または dll をリンクするときは、静的ライブラリから呼び出されるがその中で定義されていないライブラリを提供する別のライブラリとリンクする必要があります。
リンカーに他のライブラリを自動的にリンクさせたい場合は、Stephen の提案が機能し、boost や stlport などの非常に評判の高いライブラリで使用されます。これを行うには、静的ライブラリのメイン ヘッダー ファイルにプラグマを置きます。静的ライブラリとその依存物を含める必要があります。
ただし、私の意見では、この機能は実際にはライブラリ作成者向けであり、ライブラリはシステム ライブラリ パス内にあるため、リンカーは簡単に見つけることができます。また、boost と stlport の場合、この機能を使用して、次のオプションで定義された同じライブラリの複数のバージョンをサポートします。 #define
■ オプションが異なると、異なるバージョンのライブラリをリンクする必要があります。これは、ユーザーがある方向でブーストを構成し、別の方向で構成されたライブラリとリンクする可能性が低いことを意味します。
アプリケーション コードに関して私が好むのは、必要な部分を明示的にリンクすることです。
他のヒント
リンカーは他のライブラリを自動的に取り込みませんが、次のライブラリを使用できます。 #pragma comment (lib, "static.lib") ヘッダー ファイルにプラグマを追加することで、追加ファイルをリンクするプロセスを簡素化します。
静的C ++ lib、static.libを持っているとします。C++共有lib、Shared.libからいくつかの関数を呼び出したいとします。出来ますか?
はい、たとえば、静的ライブラリ内から Windows 関数を呼び出す場合、それらは通常、動的ライブラリからのものであるため、違いはありません。
ここで、Static.libにリンクしているが共有.libにリンクしていないShared2.libなど、別の共有LIBがあると仮定します。この場合、リンカーはshared2.libをShared2.libに自動的にリンクしますか?
このような依存関係があると、後で問題が発生する可能性があります。代わりに、次を使用してライブラリを動的にロードすることをお勧めします。 ロードライブラリ(), こうすることで、コンパイル/リンク中にそのような依存関係を追跡する必要がなくなります。