Provided by: manpages-ja_0.5.0.0.20210215+dfsg-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> が作成しました。