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