1. ホーム
  2. c++

[解決済み] スタティック・ライブラリとシェアード・ライブラリの違い?

2022-03-16 22:47:57

質問

スタティック・ライブラリとシェアード・ライブラリの違いは何ですか?

私はEclipseを使っていますが、Static LibrariesとShared Librariesを含むいくつかのプロジェクトタイプがありますね?どちらかに優位性があるのでしょうか?

どのように解決するのですか?

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

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

それぞれの方式にメリットとデメリットがあります。

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

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

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