1. はじめに

この HOWTO はプログラマ向けであり、GNU ツールセットを利用して、Linux 上でプログラムライブラリを作成する方法、およびその使用方法を説明するものです。 「プログラムライブラリ」とは、のちのちプログラムに組み込むためのコンパイル済みコード (およびデータ) を含む、単なるファイルのことです。プログラムライブラリは、プログラムを、よりモジュール化され、より速く再コンパイルでき、より簡単に更新できるものにします。 プログラムライブラリは三つのタイプ、すなわち、静的ライブラリ (static library)、共有ライブラリ (shared library)、動的ライブラリ (dynamically loaded library)、に分類することができます。

この文書は、最初に、静的ライブラリ (プログラムが実行される前にその実行可能プログラムに組み込まれるライブラリ) について説明します。それから、共有ライブラリ (プログラム実行時にロードされ、かつ複数のプログラム間で共有されるライブラリ) について説明します。最後に、動的ライブラリ (プログラム実行中の任意の時点でロードして使用することが可能なライブラリ) について説明します。 動的ライブラリのライブラリフォーマットは、実際には別の種類というわけではありません (静的ライブラリも共有ライブラリも動的ライブラリとして使用することが可能です)。 その代わりに、プログラマが動的ライブラリを使用する方法に違いがあります。 この HOWTO は、例を挙げている章と、その他の情報源への参照を挙げている章で締めくくります。

ライブラリを開発しているほとんどの開発者は、共有ライブラリを作成すべきです。 というのは、ユーザが、そのライブラリを使用するアプリケーションとは別々にライブラリを更新できるようになるからです。 動的ライブラリは便利ですが、使用するには少し手間がかかります。 また、多くのプログラムでは、動的ライブラリが提供する柔軟性を必要とはしません。 これとは逆に、静的ライブラリの場合、ライブラリを更新するのは非常に厄介です。 そのため、日常的に利用しようとしているならば、静的ライブラリはお勧めしません。 ただし、各ライブラリにはそれぞれの利点があります。 利点については、各ライブラリごとの章でそれぞれ説明します。 C++ と動的ライブラリを使用する開発者は、「C++ dlopen mini HOWTO」も参照してください。

共有ライブラリを指して dynamically linked library (DLL) という用語を使う人がいること、その DLL という用語を動的ライブラリとして使用される任意のライブラリを指すために使う人がいること、また、どちらかの条件を満たすライブラリを指すために DLL という用語を使う人がいること、には注意したほうがよいです。 いずれを指すにしても、この HOWTO では Linux における DLL を扱います。

この HOWTO では、実行可能ファイルおよびライブラリ用の Executable and Linking Format (ELF) フォーマット (昨今のほとんど全ての Linux ディストリビューションで使用されているフォーマット) についてのみ扱います。 GNU gcc ツールセットは、実際には ELF 以外のライブラリフォーマットを扱うことができます。特に、ほとんどの Linux ディストリビューションでは、旧式の a.out フォーマットを今なお使用することが可能です。 しかしながら、これらのフォーマットはこの文書の対象外とします。

多くのシステムへと移植する必要のあるアプリケーションを作成しているならば、ライブラリを構築してインストールするとき、Linux ツールを直接使用する代わりに、GNU libtool を使用することを考慮したほうがよいかもしれません。 GNU libtool は、共有ライブラリ使用時の複雑さ (例えば、共有ライブラリの作成やインストール等) を一貫性のある移植性の高いインターフェースで隠蔽する、汎用的なライブラリサポートスクリプトです。 Linux 上では、GNU libtool は、この HOWTO で説明されているツール群と約束ごとの上に構築されています。 動的ライブラリに対する移植性の高いインターフェースとして、様々なポータビリティラッパーを使用することができます。 GNU libtool には「libltdl」と呼ばれるラッパーが含まれています。 他の選択肢としては、移植性のある方法でモジュールの動的ローディングをサポートする glib ライブラリ (glibc と混同しないでください) を使用することもできます。 glib の詳細については http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.html で学習することができます。再度述べますが、Linux 上では、この機能は、この HOWTO 内で説明されている構成物を利用することによって実装されています。もしもあなたが実際に Linux 上でコードの開発またはデバッグをされているなら、おそらく、この HOWTO 内の情報をこれから先必要とされることでしょう。

この HOWTO の一次配布場所は http://www.dwheeler.com/program-library/ であり (訳注:日本語訳は http://www.linux.or.jp/JF/JFdocs/Program-Library-HOWTO/ にあります)、Linux Documentation Project (http://www.linuxdoc.org/) に寄贈されています。著作権は David A. Wheeler にあり (Copyright (C) 2000)、General Public License (GPL) でライセンスされています。詳細な情報については最後の章を読んでください。