table of contents
other versions
LIBTOOL(301) | LIBTOOL(301) |
名前¶
libtool - ライブラリのコンパイル・ビルド・ インストール・アンインストールをする書式¶
libtool [-n] [--config] [--debug] [--dry-run] [--features] [--finish] [--mode=MODE] [--quiet] [--silent] [MODE-ARGS...]説明¶
libtool は静的ライブラリや共有ライブラリの コンパイル・リンク・インストール・アンインストールの複雑さを簡略化する。 異なるプラットフォームそれぞれで、完全な機能を 統一的なインターフェースを介して使用することができ、 プラットフォーム固有の厄介な癖はプログラマーから隠蔽される。コンパイルモード¶
コンパイルモードの場合、MODE-ARGS は 標準的なオブジェクトファイルを作成するために使われる コンパイラコマンドである。 これらの引き数は C コンパイラの名前で始まり、 オブジェクトファイルのみを作成するよう、 -c コンパイラフラグを含んでいなければならない。lightside:% libtool cc -c foo/x.c -o foo/x.lo
リンクモード¶
リンクモードはライブラリや実行可能プログラムを作成するために、 オブジェクトファイル (ライブラリオブジェクトも含む) をリンクする。- .la
- libtool ライブラリを作成する。 このライブラリはライブラリオブジェクト (`.lo' ファイル) のみからビルドされなければならない。 -rpath オプションが必要である。 現在の実装では、libtool ライブラリはアンインストールされた他の libtool ライブラリに依存できない。
- .o .lo
- (一般には `ld -r' を使うことで) 入力ファイルから 再ロード可能なオブジェクトファイルが作成される。 この手法は ``部分リンク'' と呼ばれることが多い。
- other
- 実行可能なプログラムが作成される。
実行モード¶
実行モードでは、ライブラリパスの環境変数が自動的にセットされ (そして -dlopen によって修正されて)、プログラムが実行される。インストールモード¶
インストールモードでは、MODE-ARGS を cp(1) もしくは BSD-互換の install(1) から始まる インストールコマンドとして解釈する。フィニッシュモード¶
フィニッシュモードは、システム管理者の libtool ライブラリ インストール作業を補助し、 libtool ライブラリの探索およびユーザー プログラムへのリンクができるようにする。アンインストールモード¶
このモードではインストールされたライブラリ (もしくはファイル) を削除する。オプション¶
グローバルオプション¶
- --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 と同じ。
それ以外の場合は何も影響を及ぼさない。
- -dlpreopen FILE
- 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 までの範囲のすべてのインターフェース番号を実装していて、 このバージョンの範囲にあるライブラリに対して過去にリンクされた すべての実行ファイルは、このライブラリを使うことができる、 ということである。
インターフェースの設計¶
良いライブラリインターフェースを書くには、 練習とライブラリが解決しようとしている問題に対する徹底的な理解が必要である。 良いインターフェースを設計すれば、 頻繁に変更する必要はなく、ドキュメントを更新し続ける必要もなく、 クライアントがライブラリの使い方を再び勉強し続ける必要もないだろう。AUTOMAKE ルールの書き方¶
libtool ライブラリのサポートは、 LTLIBRARIES プライマリのもとに実装されている。- 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; }
const lt_dlsymlist * lt_preloaded_symbols;
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
lightside:~% libtool cc -o libbaz.a foo.o bar.o ar cru libbaz.a foo.o bar.o ranlib libbaz.a
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)
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
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 を作成し、 automake と libtool のためのマクロを忘れずに追加する。AC_DEFUN(AM_INIT_AUTOMAKE) AC_INIT(a.c) AM_INIT_AUTOMAKE(a, 1.0) AC_PROG_CC AM_PROG_LIBTOOL AC_OUTPUT(Makefile)
# ライブラリのビルド 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> へ報告してください。June 2002 | libtool 1.4.2 |