静的ライブラリまたは静的にリンクされたライブラリには、ビルド時にコンピュータプログラムに組み込むことができる関数とデータが含まれており、実行時に別のファイルでライブラリにアクセスする必要はありません。[ 1 ]すべてのライブラリが静的にリンクされている場合、結果として得られる実行可能ファイルはスタンドアロン、つまり静的ビルドになります。
静的ライブラリは、ビルド時に他の静的ライブラリおよびオブジェクト ファイルとマージされて単一の実行可能ファイルを形成するか、またはコンパイル時/リンク時に決定された静的メモリ オフセットで対応する実行可能ファイルのアドレス空間に実行時にロードされます。
歴史的に、すべてのライブラリ リンクは静的でしたが、今日では動的リンクが代替手段となり、固有のトレードオフを伴います。
静的リンクが動的リンクよりも優れている点は、アプリケーションに必要なライブラリルーチンが実行時に確実に利用可能であることです。これは、これらのルーチンのコードが実行ファイルに埋め込まれているためです。動的リンクでは、ライブラリファイルが見つからないだけでなく、見つかったとしても互換性のないバージョンである可能性があります。静的リンクはDLL地獄、あるいはより一般的には依存関係地獄を回避できるため、開発、配布、インストールを簡素化できます。
静的リンクでは、スマートリンカーは実際に使用されるコードのみを組み込みますが、動的ライブラリではライブラリ全体がアドレス空間にロードされるため、プログラムで使用されないコードがメモリにロードされる可能性があります。ただし、複数のプログラムがそのコードを使用している場合、共有コードのコピーは1つだけがメモリにロードされます。
静的リンクでは、実行ファイルのサイズが動的リンクよりも大きくなります。これは、静的にリンクされた実行ファイルには、プログラムで使用されるライブラリルーチンのコピーが含まれるためです。ただし、アプリケーションのサイズを実行ファイルとその動的ライブラリの合計として測定する場合、全体的なサイズは一般的に静的リンクの方が小さくなります。ただし、同じ動的ライブラリが複数のアプリケーションで使用される場合、アプリケーションと動的ライブラリを合わせた全体的なサイズは、動的リンクの方が小さくなる可能性があります。
Windowsでは、プログラムの動的ライブラリをプログラムファイルと共にインストールするのが一般的です。 [ 2 ] Unix系システムでは、パッケージ管理システムを使用して適切なライブラリファイルが共有場所に確実に存在するようにできるため、この方法はそれほど一般的ではありません。ライブラリファイルはアプリケーション間で共有できます。これにより、メモリ容量を節約できます。ライブラリを使用する各アプリケーションを更新することなく、ライブラリを更新してバグやセキュリティ上の欠陥を修正できます。しかし、共有された動的ライブラリは依存関係の問題を引き起こすリスクがあります。
実際には、多くの実行可能ファイルは静的ライブラリと動的ライブラリの両方を使用します。
静的ライブラリ関数は、他の静的ライブラリ内の関数または手続きを呼び出すことができます。リンカーとローダーは、他のオブジェクトファイルと同様にこれを処理します。静的ライブラリファイルは、実行時にリンクローダー(例えば、X11モジュールローダー)によってリンクされる場合があります。ただし、このような処理を静的リンクと呼べるかどうかについては議論があります。
静的ライブラリはC言語またはC++言語で簡単に作成できます。これらの言語は、外部リンケージまたは内部リンケージを示すストレージクラス指定子やその他の機能を提供しています。このようなライブラリを作成するには、エクスポートされる関数やプロシージャ、その他のオブジェクトや変数を外部リンケージとして指定する必要があります(つまり、Cstaticキーワードを使用しない)。静的ライブラリのファイル名は、通常、 Unix系システム[ 1 ]では「.a」拡張子、 Microsoft Windowsでは「.lib 」拡張子を持ちます。
例えば、Unix系システムで、ファイルclass1.o、class2.o、class3.oからlibclass.aという名前のアーカイブを作成するには、次のコマンドを使用します: [ 1 ]
ar rcs libclass.a class1.o class2.o class3.o
class1.o、class2.o、class3.oに依存するプログラムをコンパイルするには、次のようにします。
cc main.c libclass.a
または(libclass.aが/usr/local/libのような標準ライブラリパスに配置されている場合)
cc main.c -lclass
または(リンク中)
ld ... main.o -lclass ...
の代わりに:
cc main.c クラス1.o クラス2.o クラス3.o
プライベートDLLは、特定のアプリケーションと共にインストールされ、そのアプリケーションでのみ使用されるDLLです。