2012-03-04 8 views
0

いくつかの調査とテストの結果、ライブラリにリンクするとき、私のプロジェクトは、リンク先のライブラリと同じランタイムライブラリ(MT、MDなど)のリンクオプションを持つ必要があることがわかりました。リンカーは重複したリンケージを防止しますか?

静的ライブラリ(通常はランタイムライブラリに静的にリンクされています)を使用すると、ライブラリと静的にリンクされているため、ランタイムライブラリと2回リンクしません応用?または、リンカがこれを防ぐ?

答えて

1

通常、静的ライブラリはランタイムライブラリにリンクされません。代わりに、ランタイムへの参照はすべて解決されません。つまり、静的ライブラリファイルにはコードのオブジェクトファイルが含まれますが、ランタイムライブラリのオブジェクトファイルは含まれません。

このライブラリを使用して実際の実行可能ファイルをビルドするときだけ、ランタイムライブラリにリンクします。これにより、静的ライブラリからオープンリファレンスが解決されます。 これは通常、静的リンクライブラリをコンパイルするときのデフォルトの動作です。

つまり、ほとんどのコンパイラでは、すでに静的ライブラリの外部参照を解決するようにリンカを強制することができます。これは、最終実行ファイルのコンパイルに渡すことを望まない依存関係がライブラリにある場合に役立ちます。

ただし、シンボルが重複すると、ランタイムへの早期リンクを強制する場合など、リンカーが壊れる可能性があります。運が良ければ重複するシンボルについての警告を受け取るだけですが、リンカーの実装に応じて、まったくリンクしないこともあります。

+0

ああ。そうですか。例えば、私がlibBにリンクするlibAを持っているならば、私が強制しない限り、libBはlibAの一部ではありません。また、実行可能ファイルでlibAのみを使用すると、libAとlibBをリンクする必要があります。 – subb

+0

まさにその通りです。 – ComicSansMS

+0

ありがとうございます。 DLLについてはどうですか? – subb

関連する問題