Provided by: manpages-ja_0.5.0.0.20110915-1_all bug

名前

       libtool - ライブラリのコンパイル・ビルド・ インストール・アンインストールをする

書式

       libtool  [-n]  [--config]  [--debug]  [--dry-run]  [--features]  [--finish]  [--mode=MODE]
       [--quiet] [--silent] [MODE-ARGS...]

       リンクモード:  [-lNAME]   [-o    OUTPUT-FILE]   [-LLIBDIR]   [-R   LIBDIR]   [-all-static]
       [-avoid-version]  [-dlopen  FILE]  [-dlpreopen  FILE]  [-export-dynamic] [--export-symbols
       FILE] [--export-symbols  REGEX]  [--module]  [-no-undefined]  [-release  RELEASE]  [-rpath
       LIBDIR] [-static] [-version-info CURRENT[:REVISION[:AGE]]

       実行モード: [-dlopen FILE]

       libtool [--features] [--help] [--version]

説明

       libtool   は静的ライブラリや共有ライブラリの  コンパイル・リンク・インストール・アンインス
       トールの複雑さを簡略化する。  異なるプラットフォームそれぞれで、完全な機能を  統一的なイン
       ターフェースを介して使用することができ、  プラットフォーム固有の厄介な癖はプログラマーから
       隠蔽される。

       libtool はコンパイル・実行・リンク・フィニッシュ・インストール・アンインストール という  6
       つのモードで動作できる。

   コンパイルモード
       コンパイルモードの場合、MODE-ARGS  は 標準的なオブジェクトファイルを作成するために使われる
       コンパイラコマンドである。 これらの引き数は C コンパイラの名前で始まり、  オブジェクトファ
       イルのみを作成するよう、 -c コンパイラフラグを含んでいなければならない。

       libtool  は出力ファイルの名前を決定するとき、 ソースファイル名からディレクトリ構成要素を取
       り除き、 それから  C  言語のソースコードの拡張子  `.c'  をライブラリオブジェクトの  拡張子
       `.lo' に置き換えるという方法を用いる。

       共有ライブラリがビルドされる場合、必要な PIC 作成フラグすべてが コンパイルコマンドに挿入さ
       れる。 -static  オプションを指定すると、たとえ  --disable-static  が  設定されていたとして
       も、libtool は `.o' ファイルを作成する。

       -o  オプションが直接サポートされていないプラットフォーム上では (コンパイラによって作成され
       たオブジェクトファイルのロックと移動により) エミュレートを行う。  したがって、以下のような
       通常の構文を使うことができる。

              lightside:% libtool cc -c foo/x.c -o foo/x.lo

       プラットフォームが -c-o オプションをサポートしていない場合、 古い `foo/x.o' を上書きせ
       ずに `foo/x.lo' をビルドすることはできない。 この場合、`foo/x.o' が `foo/x.lo' の後に (再)
       ビルドされることを 確かめておかなければならない。

   リンクモード
       リンクモードはライブラリや実行可能プログラムを作成するために、  オブジェクトファイル (ライ
       ブラリオブジェクトも含む) をリンクする。

       MODE-ARGS  は、C  コンパイラがオブジェクトファイルから  (-o   フラグにより)   出力ファイル
       OUTPUT-FILE を作成する ときに使用するコマンドで構成される。 以下のように、ファイルの形式は
       OUTPUT-FILE の拡張子に依存する。

       .la    libtool ライブラリを作成する。 このライブラリはライブラリオブジェクト (`.lo' ファイ
              ル) のみからビルドされなければならない。 -rpath オプションが必要である。 現在の実装
              では、libtool ライブラリはアンインストールされた他の libtool ライブラリに依存できな
              い。

       .a     ar(1) と (あるいは) ranlib(1) を使って 標準ライブラリが作成される。

       .o .lo (一般には `ld -r' を使うことで) 入力ファイルから 再ロード可能なオブジェクトファイル
              が作成される。 この手法は ``部分リンク'' と呼ばれることが多い。

       other  実行可能なプログラムが作成される。

   実行モード
       実行モードでは、ライブラリパスの環境変数が自動的にセットされ (そして -dlopen  によって修正
       されて)、プログラムが実行される。

       一番目の MODE-ARGS はプログラム名として扱われ、 残りはプログラムの引数として扱われる。

       引数の中のどれかが libtool 実行ファイルのラッパーであった場合、 その引数はそれぞれ対応する
       アンインストール済みバイナリの名前に変換される。  このとき、必要とされるライブラリディレク
       トリがライブラリパスに加えられる。

   インストールモード
       インストールモードでは、MODE-ARGScp(1) もしくは BSD-互換の install(1) から始まる イン
       ストールコマンドとして解釈する。

       残りの MODE-ARGS は、インストールコマンドの 引数として解釈される。

       このコマンドは実行され、 インストール後の処理に必要な非特権コマンドもすべて完了する。

   フィニッシュモード
       フィニッシュモードは、システム管理者の   libtool   ライブラリ   インストール作業を補助し、
       libtool ライブラリの探索およびユーザー プログラムへのリンクができるようにする。

       MODE-ARG はライブラリディレクトリ名として解釈される。 このコマンドを実行するのにはスーパー
       ユーザー特権が必要なため、 --dry-run オプションを使うと便利だろう。

   アンインストールモード
       このモードではインストールされたライブラリ (もしくはファイル) を削除する。

       一番目の  MODE-ARG はファイルを削除するためのプログラム名 (一般には `/bin/rm') である。

       残りの MODE-ARGS は削除プログラムの (`-' で始まる) フラグもしくは、 削除するファイルの名前
       である。

オプション

   グローバルオプション
       --config
              libtool の設定変数を表示して終了する。

       --debug
              シェルスクリプトのトレースモードを有効にして、標準出力に書き出す。

       -n, --dry-run
              ファイルの作成・修正・削除を行わず、libtool によってどのような コマンドが実行される
              かを表示する。

       --features
              libtool の基本的な特徴を表示する。 また静的ライブラリと共有ライブラリが有効になって
              いるかを表示する。

       --finish
              --mode=finish と同じ。

       --mode=MODE
              MODE      をオペレーションモードとする。     デフォルトでは、オペレーションモードは
              MODE-ARGS の内容から推論される。 MODE  を指定する場合、次のうちの一つでなければなら
              ない。

              compile
                     ソースファイルを libtool オブジェクトにコンパイルする。

              execute
                     他のプログラムがアンインストールされたプログラムやライブラリ (libtool により
                     作成されたもの)  を使うことができるように、   ライブラリパスを自動的に設定す
                     る。

              finish システムへの libtool ライブラリのインストールを完了する。

              install
                     ライブラリや実行ファイルをインストールする。

              link   ライブラリや実行ファイルを作成する。

              uninstall
                     ライブラリや実行ファイルを削除する。

       --features
              libtool の設定情報を表示して終了する。 このオプションを使うと、パッケージは共有ライ
              ブラリと静的ライブラリの どちらを作るか決定できる。

       --help 使用法のメッセージを標準出力に表示して、正常終了する。 --mode=MODE が指定されている
              場合は、 指定されたモードについてのヘルプが表示される。

       --version
              バージョン情報を標準出力に表示して、正常終了する。

   リンクモードオプション
       -lNAME OUTPUT-FILE はインストール済みの ライブラリ libNAME を必要とする。 このオプションは
              OUTPUT-FILE が実行ファイルでなくても必要とされる。

       -o OUTPUT-FILE
              指定したオブジェクトとライブラリから OUTPUT-FILE を作成する。

       -LLIBDIR
              必要なインストール済みライブラリを LIBDIR から検索する。

       -R LIBDIR
              OUTPUT-FILE が実行ファイルの場合は LIBDIR を実行時パスに加える。 OUTPUT-FILE がライ
              ブラリの場合は  `-RLIBDIR' を DEPENDENCY_LIBS に加える。 これは、そのライブラリが実
              行ファイルにリンクされるときに必ず LIBDIR  を実行ファイルの実行時パスに加えるためで
              ある。

       -all-static
              OUTPUT-FILE がプログラムの場合は、 そのプログラムをどの共有ライブラリともリンクさせ
              ない。 OUTPUT-FILE がライブラリの場合は静的ライブラリを作成するのみである。

       -avoid-version
              どのような種類のバージョニングも行わない  (バージョン情報は組み込まれず、シンボリッ
              クリンクも作られない)。  このオプションはバージョニングを必要とするプラットホーム上
              では働かない。

       -dlopen FILE
              ホストプラットホーム上でネイティブな   ダイナミックロードがサポートされていない場合
              や、  実行ファイルが -static-all-static を 使ってリンクされる場合は、-dlpreopen
              FILE と同じ。 それ以外の場合は何も影響を及ぼさない。

              FILE が `実行ファイル自身' であった場合、 libtool は実行ファイルが  -export-dynamic-dlpreopen を使って自らを dlopen(3) できるかを確かめる。

       -dlpreopen FILE
              FILE を出力プログラムにリンクし、そのシンボルを LT_PRELOADED_SYMBOLS に加える。

              FILE    が   `出力プログラム自身'   であった場合、   出力プログラム自身のシンボルが
              LT_PRELOADED_SYMBOLS に加えられる。

       -export-dynamic
              OUTPUT-FILE のシンボルを dlsym(3) を使って解決できるようにする。

       -export-symbols FILE
              これをサポートしているプラットホーム上では、 リンカは FILE にリストされているシンボ
              ルのみをエクスポートする。 FILE の名前は `.sym' で終っていなければならず、 1 行に 1
              つのシンボルを含んでいなければならない。 デフォルトではすべてのシンボルがエクスポー
              トされる。

       -export-symbols-regex REGEX
              REGEX  regex(7)  にマッチするシンボルのみがエクスポートされる以外は -export-symbols
              と同じ。

       -module
              ダイナミックロードできるライブラリを作成する。 モジュール名は `lib'  で始まる必要は
              ないが、 名前の衝突を避けるため `libname' と `name' はパッケージの中で 同時に使用す
              べきではない。

       -no-undefined
              OUTPUT-FILE が他のライブラリに依存していないことを宣言する。 他のライブラリに依存す
              る共有ライブラリを作れないプラットホームもある。

       -release RELEASE
              ライブラリがパッケージのリリース   RELEASE   で作られたことを指定する。  これによっ
              て、ユーザーはどのバージョンが他のものより新しいかを 簡単に判断できる。  このフラグ
              を使うと、パッケージの各リリースのいかなるペアの間にも バイナリ互換はなくなることに
              注意せよ。 バイナリ互換にしたい場合は、-version-info フラグを使うこと。

       -rpath LIBDIR
              OUTPUT-FILE がライブラリの場合、 最終的に LIBDIR にインストールされる。

       -static
              OUTPUT-FILE がプログラムの場合、 アンインストールされた共有 libtool  ライブラリはリ
              ンクしない。 OUTPUT-FILE がライブラリの場合、 静的ライブラリを作成するのみである。

       -version-info CURRENT[:REVISION[:AGE]]
              OUTPUT-FILE  が libtool ライブラリであるとき、 ライブラリをビルドするためにインター
              フェースバージョン情報 CURRENT, REVISION, AGE を使う。 パッケージのリリース情報を指
              定するために、  このオプションを使ってはいけない。 むしろ -release フラグを参照すべ
              きである。

   実行モードオプション
       -dlopen FILE
              FILE を含んでいるディレクトリをライブラリパスに加える。

バージョニング

       libtool は共有ライブラリ用に独自のバージョニングシステムを持っている。  このシステムを使い
       たい場合は、-version-info     オプションを     使わなければならない。     このオプションは
       CURRENT[:REVISION[:AGE]] という形式の引数を受け付ける。

       CURRENT
              インターフェースのバージョン。インターフェースとは "外側"  の世界に見えるすべてのも
              ので、 変数・関数プロトタイプ・出力形式などである。

       REVISION
              CURRENT からの相対値で与える実装のバージョン。

       AGE    このライブラリが実装している最新のインターフェースと   最古のインターフェースとの違
              い。 言い替えると、このライブラリは `CURRENT - AGE' から CURRENT までの範囲のすべて
              のインターフェース番号を実装していて、 このバージョンの範囲にあるライブラリに対して
              過去にリンクされた すべての実行ファイルは、このライブラリを使うことができる、  とい
              うことである。

       REVISIONAGE が省略された場合のデフォルトは 0 である。 AGECURRENT インターフェース
       番号より小さいか  等しくなければならないことにも注意すること。  2   つのライブラリが同一の
       CURRENT 番号と AGE 番号であるとき、 ダイナミックリンカは大きい REVISION 番号のライブラリを
       選択する。

       バージョニングのガイドライン:

       · 1. それぞれの libtool ライブラリについて `0:0:0' というバージョン情報から始めなさい。

       · 2.  バージョン情報を更新するのは ソフトウェアの公開リリースの直前だけにしなさい。 頻繁な
       更新は不必要であり、現在のインターフェース番号が大きくなるのを 早くするだけである。

       · 3.  前回の更新からライブラリのソースコードが すっかり変更されたなら、REVISION を増加させ
       なさい (C:R:AC:R+1:A になる)。

       · 4.   前回の更新からインターフェースが    追加・削除・変更されたなら、CURRENT    を増加さ
       せ、REVISION を 0 にしなさい。

       · 5. 前回の公開リリースからインターフェースが 追加されたなら、AGE を増加させなさい。

       · 6. 前回の公開リリースからインターフェースが 削除されたなら、AGE を 0 にしなさい。

       パッケージバージョンをライブラリ名にエンコードしたい場合や、  libtool のバージョニングと衝
       突せずに   他のバージョニングシステムを使いたい場合は、-release   を使うこと。    たとえば
       binutils-2.7.0.2  に付属する `libbfd.so.2.7.0.2' は libtool のバージョニングと明らかに衝突
       する。 `-release 2.7.0' を使えば `libbfd-2.7.0.so.0.0.0' で終ることができる。

       異なる CURRENT バージョンのライブラリや 異なる -release のライブラリはバイナリ非互換であろ
       う。

インターフェースの設計

       良いライブラリインターフェースを書くには、  練習とライブラリが解決しようとしている問題に対
       する徹底的な理解が必要である。  良いインターフェースを設計すれば、  頻繁に変更する必要はな
       く、ドキュメントを更新し続ける必要もなく、  クライアントがライブラリの使い方を再び勉強し続
       ける必要もないだろう。

       設計に対するガイドラインをいくつか示す:

       · 前もって計画を立てる
       エントリーポイントを頻繁に削除する必要がないように、  それぞれのインターフェースを最小にす
       るようにしなさい。

       · インターフェースの変更を避ける
       もしインターフェースを再設計する必要があるならば、  クライアントが既に存在するコードを書き
       直す必要がないように、 互換性のある関数も残しておくようにしなさい。

       · 見えないデータタイプを使う
       クライアントがアクセスする必要のあるデータタイプの定義は少ない程良い。  可能ならば、関数が
       ジェネリックポインタ  (内部データタイプにキャストすることが可能) を 受け付けるように設計し
       なさい。 クライアントに直接データを操作させるよりは、 アクセス関数を提供しなさい。  このよ
       うするとインターフェースを変更することなく データ構造を自由に変更できる。

       · ヘッダファイルを使う
       それぞれのライブラリについて大域関数・大域変数をヘッダファイルに書いて  ライブラリのソース
       ファイルにインクルードしておけば、 気づかずにインターフェースの変更をしてしまっても コンパ
       イラが知らせてくれるだろう。

       · 可能なときはいつでも静的 (もしくは等価なもの) を使う
       ライブラリに大域関数が少ないほど、ライブラリは柔軟に変更できる。  静的な関数・変数は、クラ
       イアントがアクセスできないから  インターフェースの変更とはならないので、好きなだけ変更する
       ことができる。

AUTOMAKE ルールの書き方

       libtool ライブラリのサポートは、 LTLIBRARIES プライマリのもとに実装されている。

       プログラムを libtool ライブラリにリンクするためには、 ライブラリ名を指定する program_LDADD
       変数を使うこと。 libtool に -static といったオプションを渡すためには program_LDFLAGS  を使
       うと良い。

       libtool  ライブラリをビルドするには、  ライブラリ名を指定する lib_LTLIBRARIES を使うこと。
       そして、たとえば、libtool-version-info オプションを 渡すには lib_LDFLAGS  を使うこと。
       次のセクションに例がある。

       作業をするためには、パッケージにいくつかの基本的なファイルを入れたり、 libtoolize を使う必
       要があるだろう。 libtool スクリプトを直接インクルードしてはならない。

       config.guess
              標準システム名を推測しようとする。

       config.sub
              標準システム名を確認するサブルーチンスクリプト。

       ltconfig
              指示されたシステムについて libtool スクリプトを作成する。

       ltmain.sh
              基本的な libtool の機能を実装した一般的なスクリプト。

モジュールのダイナミックロード

       libtool のダイナミックロード機能を使うためには、 configure.in のなかで AM_PROG_LIBTOOL  よ
       り前に  マクロ  AC_LIBTOOL_DLOPEN  を使わなければならない。 さもなければ、libtool はそのプ
       ラットホームには ダイナミックロードのメカニズムがないと仮定して、 これをシミュレートしよう
       とする。  このシミュレーション機能を使うためには、  実行ファイルをリンクするときに -dlopen-dlreopen  フラグを使い、  ダイナミックロードするオブジェクトを宣言しなければならない。
       libtool  はオブジェクトファイルをリンクし、 以下のような実行ファイルのシンボルテーブルを保
       持した データ構造を作成する。

              struct lt_dlsymlist { const char *NAME; lt_ptr_t ADDRESS; }

       NAME    には、"fprintf"     のような、シンボル名のアスキー文字列が保持される。     ADDRESS
       は、&fprintf のような、 適切なオブジェクトへのジェネリックポインタである。

              const lt_dlsymlist * lt_preloaded_symbols;

       この配列は実行ファイルにリンクされている  プリロードされたシンボルを表す。 -dlpreloaded さ
       れたファイルのそれぞれについて要素が存在し、  ファイル名  NAME   と   `0'   というアドレス
       ADDRESS、  およびこのファイルからエクスポートされたすべてのシンボルを保持する。 実行ファイ
       ル自身については、特別な名前 @PROGRAM@ が使われる。 最後のエレメントは NAME と `0'  という
       ADDRESS を持つ。

       ダイナミックロードされるライブラリもしくは、  モジュールをダイナミックロードしようとする実
       行ファイルをリンクするときは、 -module フラグを指定するのを忘れないこと。

       ダイナミックロードしようとしているライブラリの外部シンボルを、  実行ファイルが参照する必要
       がある場合は、実行ファイルをリンクするときに -export-dynamic を使用すること。

       ライブラリ名にバリエーションがあるので、 プログラムはどれがダイナミックロードするための 正
       しいファイルであるのかを決定する必要がある。 直接的な方法は `.la' ファイルを調べて、
        dlname='DLNAME' という行を探すことである。 この行はライブラリをダイナミックロードできない
       場合は空で、 そうでない場合はライブラリの名前が入っている。

       ソースファイル `foo.c', `bar.c' から `libbaz' とよばれるライブラリを作成し、 次に `a' とい
       う名前の実行ファイルを作成するために `a.c' を `libbaz' と リンクしようといる。

   ライブラリの作成
       · コンパイルモード:Linux は共有ライブラリをサポートしているので、 libtool は  2  つのオブ
       ジェクトファイル、 一つは静的ライブラリ (`foo.lo')、 もう一つは共有ライブラリ (`foo.o') を
       作成する。 ソースファイル自身へのリンクをコンパイラにやらせたくないので、 -c  オプションは
       必須である。

              lightside:~% libtool cc -c foo.c
              cc -c -fPIC -DPIC foo.c -o .libs/foo.lo
              cc -c foo.c >/dev/null 2>&1
              lightside:~% libtool cc -c bar.c
              cc -c -fPIC -DPIC bar.c -o .libs/bar.lo
              cc -c bar.c >/dev/null 2>&1

       ·  リンクモード、静的ライブラリのみをビルドする: 以前に作成された `.o' というオブジェクト
       ファイルを指定している。 -o オプションは必須である。

              lightside:~% libtool cc -o libbaz.a foo.o bar.o
              ar cru libbaz.a foo.o bar.o
              ranlib libbaz.a

       · リンクモード、静的ライブラリと共有ライブラリをビルドする: `.lo'  というオブジェクトファ
       イルを指定する。 必須オプションは、前と同じ -o と ライブラリのインストールされるディレクト
       リを指示する -rpath である。 ライブラリは `.libs' ディレクトリに作成される。

              lightside:~% libtool cc -o libbaz.la foo.lo bar.lo \
                  -rpath /usr/local/lib
              cc -shared -Wl,-soname -Wl,libbaz.so.0 \
                  -o .libs/libbaz.so.0.0.0 foo.lo bar.lo
              (cd .libs && ln -s libbaz.so.0.0.0 libbaz.so.0)
              (cd .libs && ln -s libbaz.so.0.0.0 libbaz.so)
              ar cru .libs/libbaz.a foo.o bar.o
              ranlib .libs/libbaz.a
              creating libbaz.la
              (cd .libs && ln -s ../libbaz.la libbaz.la)

       · インストールモード:ライブラリを指定したパス (この場合は `/usr/local/lib')  にインストー
       ルするために  必要なコマンドを実行する。 このモードでは共有ライブラリ (`.so') と静的ライブ
       ラリ (`.a') を インストールするとともに、アンインストールと情報提供の目的で libtool ファイ
       ル (`.la') がインストールされる。

       このモードはふつう特権ユーザーとして実行されるので、 -n または --dry-run オプションを 指定
       して結果をチェックしておくとよい。

              lightside:/tmp% libtool -n install libbaz.la /usr/local/lib
              install .libs/libbaz.so.0.0.0 /usr/local/lib/libbaz.so.0.0.0
              (cd /usr/local/lib && ln -s libbaz.so.0.0.0 libbaz.so.0)
              (cd /usr/local/lib && ln -s libbaz.so.0.0.0 libbaz.so)
              install libbaz.la /usr/local/lib/libbaz.la
              install .libs/libbaz.a /usr/local/lib/libbaz.a
              ranlib /usr/local/lib/libbaz.a
              chmod 644 /usr/local/lib/libbaz.a

   実行ファイルの作成
       最初に `a.c' をコンパイルする

              cc -c a.c

       ライブラリが既にインストールされている場合には、 普段のように続行することができる

              cc a.c -lbaz -L/usr/local/lib

       ライブラリがまだインストールされていない場合は、    実行ファイルのリンク・デバッグ・インス
       トールに  libtool を使用しなければならない (一度ライブラリがインストールされるまで、これは
       つづく)。 実際の実行ファイルはインストールされるまで `.libs' 内にあり、 作業ディレクトリに
       ある実行ファイルは単なるラッパーであることに注意すること。

       曖昧さを避けるため、絶対に  -l-L を使ってアンインストールされた 共有ライブラリにリンク
       してはならない。 `.la' ファイルへのパスだけを指定すること。  以下の  (`-lm')  でわかるよう
       に、インストール済みのライブラリは問題ではない。

              lightside:~% libtool cc a.o libbaz.la -o a -lm
              cc a.o -Wl,--rpath -Wl,/usr/local/lib \
                  .libs/libbaz.so -o .libs/a -lm
              lightside:~% libtool gdb a
              [複雑なデバッグのセッションは省略]
              lightside:~% libtool install -c a /usr/local/bin/a
              install -c .libs/a /usr/local/bin/a

   Makefile.am の作成
       · 最初に簡単な  configure.in を作成し、 automakelibtool のためのマクロを忘れずに追加す
       る。

              AC_DEFUN(AM_INIT_AUTOMAKE)
              AC_INIT(a.c)
              AM_INIT_AUTOMAKE(a, 1.0)
              AC_PROG_CC
              AM_PROG_LIBTOOL
              AC_OUTPUT(Makefile)

       · 対応する Makefile.am

              # ライブラリのビルド
              lib_LTLIBRARIES=libbaz.la
              libbaz_la_SOURCES = foo.c bar.c
              libbaz_la_LDFLAGS = -version-info 0:0:0

              bin_PROGRAMS = a a.debug

              # a.c と libbaz.la から a をビルド
              a_SOURCES = a.c
              a_LDADD = libbaz.la

              # 静的デバッグバージョンを作成
              a_debug_SOURCES = a.c
              a_debug_LDADD = libbaz.la
              a_debug_LDFLAGS = -static

       · そして最後に実行する

              lightside:~% aclocal; libtoolize; automake --add-missing; autoconf
              lightside:~% ./configure; make

関連項目

        libtoolize(1), libltdl(3)

注意

       プログラムのバグについては <bug-libtool@gnu.org> へ報告してください。
       この man ページは Ragnar Hojland Espinosa <ragnar@ragnar-hojland.com> が作成しました。