静的ライブラリとリンクには、動的なライブラリとリンクと比較した場合、主に 3 つの問題に注意しなければいけません。
静的ライブラリは自己依存性 (独立性) に優れていますが、適用性に劣ります。
a.out 実行可能ファイルを静的にリンクすると、必要なライブラリルーチンは実行可能バイナリファイルの一部となります。しかし、a.out 実行可能ファイルにリンクされた静的ライブラリルーチンを更新する必要が出てきた場合 a.out ファイル全体をリンクし、生成し直さなければ、更新されたライブラリを利用することができません。動的ライブラリを使用すれば、ライブラリは a.out ファイルの一部とはならず、リンクは実行時に行われます。更新された動的ライブラリを利用するために必要なことは、新しいライブラリをシステムにインストールするだけです。
静的ライブラリの「要素」は個々のコンパイル単位 .o ファイルです。
1 つのコンパイル単位 (ソースファイル) には複数の副プログラムが含まれている場合があるので、いっしょにコンパイルすると、これらのルーチンは静的ライブラリ中の 1 つのモジュールとなります。つまり、コンパイル単位中のすべてのルーチンがいっしょに a.out 実行可能ファイルに読み込まれるが、実際に呼び出されるのはこれら副プログラムの 1 つだけであるということを意味します。この状況は、複数のライブラリルーチンを複数のコンパイル可能ソースファイルに分散するという最適化によって改良できます。ただし、プログラムによって実際に参照されるライブラリモジュールだけが実行可能ファイルに読み込まれます。
静的ライブラリのリンクでは、リンクの順序が重要です。
リンカーは、コマンド行に現れる順番、すなわち左から右に入力ファイルを処理します。リンカーがライブラリの要素を読み込むべきかどうかは、すでに処理されたライブラリの要素によって決定されます。この順番は、要素がライブラリファイル中で現れる順番に依存するだけでなく、コンパイルコマンド行上で指定されたライブラリの順番にも依存します。
例: Fortran プログラムが main.f と crunch.f の 2 つのファイルに記述され、crunch.f だけがライブラリにアクセスする場合、crunch.f または crunch.o より前にライブラリを参照するとエラーになります。
demo% f95 main.f -lmylibrary crunch.f -o myprog |
(誤)
demo% f95 main.f crunch.f -lmylibrary -o myprog |
(正)