ファイルは一種の動的ライブラリであることは知っています.so
(多数のスレッドがこのようなライブラリを共有できるため、メモリ内に複数のコピーを持つ必要はありません)。しかし、 と の違いは何でしょうか.a
?.la
これらはすべて静的ライブラリですか?
動的ライブラリが静的ライブラリよりも大きな利点を持っているのなら、なぜ静的ライブラリがまだたくさんあるのでしょうか?.so
またはにコードを組み込むのはいつが適切でしょうか.a
?
[mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l
total 96
-rw-r--r-- 1 mirror mirror 22892 Sep 2 23:25 openvpn-plugin-auth-pam.a
-rwxr-xr-x 1 mirror mirror 931 Sep 2 23:25 openvpn-plugin-auth-pam.la
-rwxr-xr-x 1 mirror mirror 23621 Sep 2 23:25 openvpn-plugin-auth-pam.so
-rw-r--r-- 1 mirror mirror 17228 Sep 2 23:25 openvpn-plugin-down-root.a
-rwxr-xr-x 1 mirror mirror 932 Sep 2 23:25 openvpn-plugin-down-root.la
-rwxr-xr-x 1 mirror mirror 18805 Sep 2 23:25 openvpn-plugin-down-root.so
ベストアンサー1
ファイルタイプの内訳
.so
ファイルは動的ライブラリです。サフィックスは「共有オブジェクト」を表します。これは、ライブラリにリンクされているすべてのアプリケーションが、結果として得られる実行可能ファイルにコピーを作成するのではなく、同じファイルを使用するためです。
.a
ファイルは静的ライブラリです。接尾辞は「アーカイブ」を意味します。これは、実際には元の .o オブジェクト ファイルのアーカイブ (ar
コマンドを使用して作成されます。tar
このコマンドは現在ライブラリの作成にのみ使用されています) にすぎないためです。
.la
ファイルは、対応するライブラリを構成するファイルを記述するためにGNU "libtools" パッケージによって使用されるテキスト ファイルです。詳細については、次の質問を参照してください。libtool の .la ファイルは何の目的ですか?
静的 vs 動的
静的
利点: ユーザーは常にアプリケーションでテストしたライブラリのバージョンを使用するため、予期しない互換性の問題が発生することはありません。
欠点: ライブラリの問題が修正された場合、そのライブラリを活用するにはアプリケーションを再配布する必要があります。ただし、ユーザーが自分で更新する可能性のあるライブラリでない限り、いずれにしてもこれを行う必要があるかもしれません。
動的
利点: ライブラリに使用されるメモリは、ライブラリを使用するすべてのプロセス間で償却されるため、プロセスのメモリ フットプリントが小さくなります。
利点: ライブラリは実行時にオンデマンドでロードできます。これはプラグインに適しており、ソフトウェアをコンパイルしてインストールするときに使用するプラグインを選択する必要がありません。新しいプラグインをオンザフライで追加できます。
欠点: アプリケーションをインストールしようとしているシステムにライブラリが存在しない、またはアプリケーションと互換性のないバージョンがインストールされている可能性があります。この問題を軽減するには、必要に応じてインストールできるように、アプリケーション パッケージにライブラリのコピーを含める必要があります。この問題は、必要な依存関係をダウンロードしてインストールできるパッケージ マネージャーによっても軽減されることがよくあります。
欠点: リンク時の最適化は一般的に不可能なので、高性能アプリケーションでは効率性に影響が出る可能性があります。Wikipediaの議論を参照してください。WPOとLTO。
動的ライブラリは、 などのシステム ライブラリに特に役立ちますlibc
。カーネル インターフェイスが変更されたため、これらのライブラリには特定の OS とバージョンに依存するコードを含める必要があることがよくあります。プログラムを静的システム ライブラリにリンクすると、そのライブラリ バージョンが対象としている OS のバージョンでのみ実行されます。ただし、動的ライブラリを使用すると、実行するシステムにインストールされているライブラリが自動的に選択されます。