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


560

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

私はEclipseを使用していますが、静的ライブラリや共有ライブラリなど、いくつかのプロジェクトタイプがありますか?一方が他方よりも有利ですか?


4
ウィキペディアには、静的ライブラリー、動的ライブラリー、および共有ライブラリーの違いがよく説明されています。
Adam Holmberg、2010

回答:


745

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

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

各方法には長所と短所があります。

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

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

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


2
「共有オブジェクトを...機能的に同等ですが、[パフォーマンスが向上する可能性があります]に置き換えます。具体的には、API(アプリケーションプログラミングインターフェース:関数シグネチャと型を含む変数)のセマンティック使用における呼び出し側に面する同等の機能ですが、実装側機能はパフォーマンスよりも異なる場合があります。たとえば、関数は常にファイルにログを記録します-> $ MY_APP_LOG_SERVERで予期されるTCPサーバー:ポートにもログを記録します。
Tony Delroy、2014

1
「[.sosは、関数の実行にわずかな追加コストが発生する」- 可能です(関数グループ/順序が静的リンクのキャッシュの局所性に対して最適化されている場合、またはOS /ローダー/コンパイラ/アーキテクチャの奇妙なクロスが原因である場合) -segment / large-pointer perf。penalties)、ただし、多くのアーキテクチャ/コンパイラ設定では、動的リンカーが呼び出しにパッチを適用して、まったく同じ呼び出しマシンのオペコードを作成します。
Tony Delroy、2014

2
「コードはコンパイル時に接続されるので、実行時にロードするための追加のコストはありません。コードはそこにあります。」-はい、いいえ...実行が必要な場合は、すべて実行可能イメージでページングできる状態になっていますが、-プログラムが最近キャッシュ内にあるほど十分に実行されていない状況から開始します-共有ライブラリで可能です(場合によっては可能です)または、特定のOS、ドライバ、または実行中の別のプログラムが、アプリが使用したい同じ共有ライブラリをすでにロードしている場合。その場合、それはキャッシュにあり、プログラムがより速く起動して実行されます。
Tony Delroy、2014

15
一部の人々が言及し損ねたのは、静的ライブラリを使用すると、コンパイラはアプリケーションに必要な関数を認識し、それらの関数を含めるだけで最適化できるということです。これにより、特に非常に大きなライブラリの非常に小さなサブセットのみを使用する場合は、ライブラリのサイズを大幅に削減できます。
jduncanator 2014

1
この答えはよりよく整理されているかもしれません。長所/短所の箇条書きリストを作成したり、違いがある場合に各ディメンションの違いを示す表を作成すると便利です。
ElefEnt 2016年

377

静的ライブラリは本屋のようなもので、共有ライブラリは...ライブラリのようなものです。前者を使用すると、本/機能の独自のコピーを取得して持ち帰ることができます。後者では、あなたと他のすべての人が同じ本/機能を使用するために図書館に行きます。したがって、(共有)ライブラリを使用したい人は、それがどこにあるかを知る必要があります。本/関数を「入手」する必要があるためです。静的ライブラリーを使用すると、本/関数はあなたが所有するものであり、あなたはそれをあなたの家/プログラム内に保持します。


70

簡略化:

  • 静的リンク:1つの大きな実行可能ファイル
  • 動的リンク:小さな実行可能ファイルと1つ以上のライブラリファイル(Windowsでは.dllファイル、Linuxでは.so、macOSでは.dylib)

1
この答えは実用的であるため、私にとって最適です。これは、コンピュータで実際に何が起こっているかについて語らないメタファーよりもずっと理にかなっています。これが起こることを知った後、私は他のすべての影響を直感的に知っています。
off99555 2018

36

静的ライブラリの場合、コードはリンカーによってライブラリから抽出され、アプリケーションをコンパイル/ビルドした時点で最終的な実行可能ファイルをビルドするために使用されます。最終的な実行可能ファイルは、実行時にライブラリに依存しません。

共有ライブラリの場合、コンパイラ/リンカーは、アプリケーションのビルド時にリンク先の名前がライブラリに存在することを確認しますが、コードをアプリケーションに移動しません。実行時には、共有ライブラリが使用可能である必要があります。

Cプログラミング言語自体には、静的ライブラリまたは共有ライブラリの概念はありません。これらは完全に実装機能です。

個人的には、ソフトウェアの配布を簡単にするため、静的ライブラリーを使用することを好みます。しかし、これは過去に多くの(比喩的な)血が流されてきたという意見です。


5
「Cプログラミング言語自体には、静的ライブラリまたは共有ライブラリの概念はありません。これらは完全に実装機能です。」
Tiger

1
こんにちはanon / @Tiger、なぜ「Cプログラミング言語自体には静的ライブラリも共有ライブラリもないという概念があります。これらは完全に実装機能です」?少し詳しく説明してもらえますか、それとも適切な参照先を教えてください。
Sunil Shahu、

@SunilShahuプログラムがどのようにコンパイルおよびリンクされるかは、使用しているコンパイラおよびリンカ、つまり言語の特定の実装に固有です。言語speficicationsは、一般的な言語は、などの機能だけ、構文、文法、実装または内蔵する方法を説明されていません
JC Rocamonde

@SunilShahuのより明白な例は、たとえばJavaScriptである場合があります。この場合、仕様(EcmaScript)は言語の機能を記述していますが、JSインタープリター(ブラウザーエンジンやNode.jsなど)を出荷するベンダーはさまざまです。一方、Pythonプログラミング言語にはいくつかの実装があります。公式のものはCPythonですが、他の言語で書かれたものもあります。
JC Rocamonde

31

静的ライブラリはアプリケーションの一部としてコンパイルされますが、共有ライブラリはコンパイルされません。共有ライブラリ、ライブラリなどに依存するアプリケーションを配布する場合。MS Windows上のDLLをインストールする必要があります。

静的ライブラリの利点は、アプリケーションを実行しているユーザーに依存関係が必要ないことです。たとえば、DLLをアップグレードする必要はありません。欠点は、必要なすべてのライブラリーと共に出荷するため、アプリケーションのサイズが大きくなることです。

共有ライブラリは、より小さなアプリケーションにつながるだけでなく、アプリケーションの一部であるライブラリに依存するのではなく、独自の、おそらくより良いバージョンのライブラリを使用する機能をユーザーに提供します


3
DLL地獄は知られている
とおり

1
「静的ライブラリはアプリケーションの一部としてコンパイルされます」...静的ライブラリは静的ライブラリとしてコンパイルされ、アプリケーションの一部としてリンクされます
idclev 463035818

19

共有ライブラリの最も重要な利点は、ライブラリを使用しているプロセスの数に関係なく、メモリに読み込まれるコードのコピーが1つしかないことです。静的ライブラリの場合、各プロセスは独自のコードのコピーを取得します。これにより、メモリが大幅に浪費される可能性があります。

OTOH、静的ライブラリの利点は、すべてがアプリケーションにバンドルされていることです。したがって、クライアントが適切なライブラリ(およびバージョン)をシステムで使用できるようになることを心配する必要はありません。


1
静的ライブラリを使用すると、実行可能イメージがメモリ上だけでなくディスク上でも大きくなります。
JustJeff 2010

それは正解です。それは、すべてがアプリケーションにバンドルされていると私が言ったときに私がほのめかしていたことです。
Jasmeet 2010

さらに、.so* nixシステム上のファイルは、共有(動的)ライブラリです。
snr '20

6

他のすべての答えに加えて、まだ言及されていないことが、デカップリングです:

私が扱ってきた実際の製品コードについて話させてください:

300以上のプロジェクト(Visual Studioを使用)で構成された非常に大きなソフトウェアは、ほとんどが静的libとしてビルドされ、最終的にすべて1つの巨大な実行可能ファイルにリンクされ、次の問題が発生します。

-リンク時間が非常に長い。リンクに15分以上かかる可能性があります。たとえば、コンパイル時間が数十秒になる場合があります。一部のツールは、コードをインストルメント化する必要があるメモリチェックツールなど、非常に大きな実行可能ファイルを抱えています。あなたは愚か者と見なされていた限界に達するかもしれません。

さらに問題なのは、ソフトウェアの分離です。この現実の例では、すべてのプロジェクトのヘッダーファイルが他のプロジェクトから到達可能です。その結果、1人の開発者が依存関係を追加するのは非常に簡単でした。最後のリンクはシンボルをすべて検出するため、ヘッダーを含めるだけでした。それは恐ろしいサイクリング依存関係と完全な混乱によって終わります。

共有ライブラリでは、開発者がプロ​​ジェクトビルドシステムを編集して依存ライブラリを追加する必要があるため、これは少し手間がかかります。共有ライブラリコードは、よりクリーンなコードAPIを提供する傾向があることを確認しました。


2
-------------------------------------------------------------------------
|  +-  |    Shared(dynamic)       |   Static Library (Linkages)         |
-------------------------------------------------------------------------
|Pros: | less memory use          |   an executable, using own libraries|
|      |                          |     ,coming with the program,       |
|      |                          |   doesn't need to worry about its   |
|      |                          |   compilebility subject to libraries|
-------------------------------------------------------------------------
|Cons: | implementations of       |   bigger memory uses                |
|      | libraries may be altered |                                     |
|      | subject to OS  and its   |                                     |
|      | version, which may affect|                                     |
|      | the compilebility and    |                                     |
|      | runnability of the code  |                                     |
-------------------------------------------------------------------------
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.