静的ライブラリと共有ライブラリの違いは?質問する

静的ライブラリと共有ライブラリの違いは?質問する

静的ライブラリと共有ライブラリの違いは何ですか?

私は Eclipse を使用していますが、静的ライブラリと共有ライブラリを含むいくつかのプロジェクト タイプがあります。一方が他方よりも優れている点はありますか?

ベストアンサー1

共有ライブラリは .so (Windows では .dll、OS X では .dylib) ファイルです。ライブラリに関連するすべてのコードはこのファイルにあり、実行時にそれを使用するプログラムによって参照されます。共有ライブラリを使用するプログラムは、共有ライブラリで使用するコードのみを参照します。

静的ライブラリは .a (または Windows では .lib) ファイルです。ライブラリに関連するすべてのコードはこのファイルにあり、コンパイル時にプログラムに直接リンクされます。静的ライブラリを使用するプログラムは、使用するコードのコピーを静的ライブラリから取得し、それをプログラムの一部にします。[Windows には .dll ファイルを参照するために使用される .lib ファイルもありますが、最初のファイルと同じように機能します。]

それぞれの方法には利点と欠点があります。

  • 共有ライブラリは、ライブラリを使用する各プログラムで重複するコードの量を減らし、バイナリを小さく保ちます。また、共有オブジェクトを機能的に同等のものに置き換えることもできますが、共有オブジェクトを使用するプログラムを再コンパイルしなくても、パフォーマンス上の利点が追加される可能性があります。ただし、共有ライブラリでは、関数の実行に若干の追加コストがかかるほか、ライブラリ内のすべてのシンボルが使用するものに接続される必要があるため、実行時の読み込みコストもかかります。さらに、共有ライブラリは実行時にアプリケーションに読み込むことができます。これは、バイナリ プラグイン システムを実装するための一般的なメカニズムです。

  • 静的ライブラリはバイナリの全体的なサイズを大きくしますが、使用するライブラリのコピーを持ち運ぶ必要がないことを意味します。コードはコンパイル時に接続されるため、実行時の読み込みコストは追加されません。コードは単にそこにあります。

個人的には共有ライブラリを好みますが、C++ 標準ライブラリの特定のバージョンや Boost C++ ライブラリの特定のバージョンなど、満たすのが難しい外部依存関係がバイナリに多くないことを確認する必要がある場合は、静的ライブラリを使用します。

おすすめ記事