.\" You may copy, distribute and modify under the terms of the LDP General .\" Public License as specified in the LICENSE file that comes with the .\" gnumaniak distribution .\" .\" The author kindly requests that no comments regarding the "better" .\" suitability or up-to-date notices of any info documentation alternative .\" is added without contacting him first. .\" .\" (C) 1999-2002 Ragnar Hojland Espinosa .\" .\" libtool man page .\" man pages are NOT obsolete! .\" .\" .\" Japanese Version Copyright (c) 2000-2003 Yuichi SATO .\" all rights reserved. .\" Translated Mon Jun 5 02:20:58 JST 2000 .\" by Yuichi SATO .\" Updated & Modified Sat Mar 1 23:41:22 JST 2003 .\" by Yuichi SATO .\" .\"WORD: build ビルド .\"WORD: compiler コンパイラー .\"WORD: canonical 標準 .\"WORD: executable 実行ファイル .\"WORD: design 設計 .\"WORD: dlopen ダイナミックロード .\"WORD: dlopening support ダイナミックロード機能 .\"WORD: global 大域 .\"WORD: library ライブラリ .\"WORD: shared 共有 .\"WORD: static 静的 .\"WORD: partial linking 部分リンク .\" .TH LIBTOOL 301 "June 2002" "libtool 1.4.2" .SH 名前 \fBlibtool\fR \- ライブラリのコンパイル・ビルド・ インストール・アンインストールをする .SH 書式 .B libtool .RB [ \-n ] .RB [ \-\-config ] .RB [ \-\-debug ] .RB [ \-\-dry\-run ] .RB [ \-\-features ] .RB [ \-\-finish ] .RB [ \-\-mode=\fIMODE ] .RB [ \-\-quiet ] .RB [ \-\-silent ] .RI [ MODE\-ARGS... ] リンクモード: [\fB\-l\fINAME\fR] [\fB\-o \fI OUTPUT\-FILE\fR] [\fB\-L\fILIBDIR\fR] [\fB\-R \fILIBDIR\fR] .RB [ \-all\-static ] .RB [ \-avoid\-version ] .RB [ "\-dlopen \fIFILE" ] .RB [ "\-dlpreopen \fIFILE" ] .RB [ \-export\-dynamic ] .RB [ "\-\-export\-symbols \fIFILE" ] .RB [ "\-\-export\-symbols \fIREGEX" ] .RB [ \-\-module ] .RB [ \-no\-undefined ] .RB [ "\-release \fIRELEASE" ] .RB [ "\-rpath \fILIBDIR" ] .RB [ \-static ] .RB [ "\-version\-info \fICURRENT\fR[\fB:\fIREVISION\fR[\fB:\fIAGE" ]] 実行モード: [\fB\-dlopen \fIFILE\fR] .BR libtool " [" \-\-features "] [" \-\-help "] [" \-\-version ] .SH 説明 .B libtool は静的ライブラリや共有ライブラリの コンパイル・リンク・インストール・アンインストールの複雑さを簡略化する。 異なるプラットフォームそれぞれで、完全な機能を 統一的なインターフェースを介して使用することができ、 プラットフォーム固有の厄介な癖はプログラマーから隠蔽される。 .B libtool はコンパイル・実行・リンク・フィニッシュ・インストール・アンインストール という 6 つのモードで動作できる。 .SS コンパイルモード \fBコンパイル\fRモードの場合、\fIMODE\-ARGS\fR は 標準的なオブジェクトファイルを作成するために使われる コンパイラコマンドである。 これらの引き数は C コンパイラの名前で始まり、 オブジェクトファイルのみを作成するよう、 \fB\-c\fR コンパイラフラグを含んでいなければならない。 \fBlibtool\fR は出力ファイルの名前を決定するとき、 ソースファイル名からディレクトリ構成要素を取り除き、 それから C 言語のソースコードの拡張子 `.c' をライブラリオブジェクトの 拡張子 `.lo' に置き換えるという方法を用いる。 共有ライブラリがビルドされる場合、必要な PIC 作成フラグすべてが コンパイルコマンドに挿入される。 \fB\-static\fR オプションを指定すると、たとえ \fB\-\-disable\-static\fR が 設定されていたとしても、\fBlibtool\fR は `.o' ファイルを作成する。 \fB\-o\fR オプションが直接サポートされていないプラットフォーム上では (コンパイラによって作成されたオブジェクトファイルのロックと移動により) エミュレートを行う。 したがって、以下のような通常の構文を使うことができる。 .sp .RS .nf lightside:% libtool cc -c foo/x.c -o foo/x.lo .fi .RE .sp プラットフォームが \fB\-c\fR と \fB\-o\fR オプションをサポートしていない場合、 古い `foo/x.o' を上書きせずに `foo/x.lo' をビルドすることはできない。 この場合、`foo/x.o' が `foo/x.lo' の後に (再) ビルドされることを 確かめておかなければならない。 .SS リンクモード \fBリンク\fRモードはライブラリや実行可能プログラムを作成するために、 オブジェクトファイル (ライブラリオブジェクトも含む) をリンクする。 \fIMODE\-ARGS\fR は、C コンパイラがオブジェクトファイルから (\fB\-o\fR フラグにより) 出力ファイル \fIOUTPUT\-FILE\fR を作成する ときに使用するコマンドで構成される。 以下のように、ファイルの形式は \fIOUTPUT\-FILE\fR の拡張子に依存する。 .TP .B .la libtool ライブラリを作成する。 このライブラリはライブラリオブジェクト (`.lo' ファイル) のみからビルドされなければならない。 \fB\-rpath\fR オプションが必要である。 現在の実装では、libtool ライブラリはアンインストールされた他の libtool ライブラリに依存できない。 .TP .B .a \fBar\fR(1) と (あるいは) \fBranlib\fR(1) を使って 標準ライブラリが作成される。 .TP .B .o .lo (一般には `ld \-r' を使うことで) 入力ファイルから 再ロード可能なオブジェクトファイルが作成される。 この手法は ``部分リンク'' と呼ばれることが多い。 .TP .B other 実行可能なプログラムが作成される。 .SS 実行モード \fB実行\fRモードでは、ライブラリパスの環境変数が自動的にセットされ (そして \fB\-dlopen\fR によって修正されて)、プログラムが実行される。 一番目の \fIMODE-ARGS\fR はプログラム名として扱われ、 残りはプログラムの引数として扱われる。 引数の中のどれかが libtool 実行ファイルのラッパーであった場合、 その引数はそれぞれ対応するアンインストール済みバイナリの名前に変換される。 このとき、必要とされるライブラリディレクトリがライブラリパスに加えられる。 .SS インストールモード \fBインストール\fRモードでは、\fIMODE\-ARGS\fR を \fBcp\fR(1) もしくは BSD-互換の \fBinstall\fR(1) から始まる インストールコマンドとして解釈する。 残りの \fBMODE\-ARGS\fR は、インストールコマンドの 引数として解釈される。 このコマンドは実行され、 インストール後の処理に必要な非特権コマンドもすべて完了する。 .SS フィニッシュモード \fBフィニッシュ\fRモードは、システム管理者の libtool ライブラリ インストール作業を補助し、 libtool ライブラリの探索およびユーザー プログラムへのリンクができるようにする。 \fIMODE\-ARG\fR はライブラリディレクトリ名として解釈される。 このコマンドを実行するのにはスーパーユーザー特権が必要なため、 \fB\-\-dry\-run\fR オプションを使うと便利だろう。 .SS アンインストールモード このモードではインストールされたライブラリ (もしくはファイル) を削除する。 一番目の \fIMODE\-ARG\fR はファイルを削除するためのプログラム名 (一般には `/bin/rm') である。 残りの \fIMODE\-ARGS\fR は削除プログラムの (`\-' で始まる) フラグもしくは、 削除するファイルの名前である。 .SH オプション .SS グローバルオプション .TP .B \-\-config libtool の設定変数を表示して終了する。 .TP .B \-\-debug シェルスクリプトのトレースモードを有効にして、標準出力に書き出す。 .TP .B \-n, \-\-dry\-run ファイルの作成・修正・削除を行わず、\fBlibtool\fR によってどのような コマンドが実行されるかを表示する。 .TP .B \-\-features libtool の基本的な特徴を表示する。 また静的ライブラリと共有ライブラリが有効になっているかを表示する。 .TP .B \-\-finish \fB\-\-mode=finish\fR と同じ。 .TP .B \-\-mode=\fIMODE \fIMODE\fR をオペレーションモードとする。 デフォルトでは、オペレーションモードは \fIMODE\-ARGS\fR の内容から推論される。 \fIMODE\fR を指定する場合、次のうちの一つでなければならない。 .RS .TP .B compile ソースファイルを libtool オブジェクトにコンパイルする。 .TP .B execute 他のプログラムがアンインストールされたプログラムやライブラリ (libtool により作成されたもの) を使うことができるように、 ライブラリパスを自動的に設定する。 .TP .B finish システムへの libtool ライブラリのインストールを完了する。 .TP .B install ライブラリや実行ファイルをインストールする。 .TP .B link ライブラリや実行ファイルを作成する。 .TP .B uninstall ライブラリや実行ファイルを削除する。 .RE .TP .B \-\-features libtool の設定情報を表示して終了する。 このオプションを使うと、パッケージは共有ライブラリと静的ライブラリの どちらを作るか決定できる。 .TP .B "\-\-help" 使用法のメッセージを標準出力に表示して、正常終了する。 \fB\-\-mode=\fIMODE\fR が指定されている場合は、 指定されたモードについてのヘルプが表示される。 .TP .B "\-\-version" バージョン情報を標準出力に表示して、正常終了する。 .SS リンクモードオプション .TP .B -l\fINAME \fIOUTPUT\-FILE\fR はインストール済みの ライブラリ \fBlib\fINAME\fR を必要とする。 このオプションは \fIOUTPUT\-FILE\fR が実行ファイルでなくても必要とされる。 .TP .B \-o \fIOUTPUT\-FILE 指定したオブジェクトとライブラリから \fIOUTPUT\-FILE\fR を作成する。 .TP .B \-L\fILIBDIR 必要なインストール済みライブラリを \fILIBDIR\fR から検索する。 .TP .B \-R \fILIBDIR \fIOUTPUT\-FILE\fR が実行ファイルの場合は \fILIBDIR\fR を実行時パスに加える。 \fIOUTPUT\-FILE\fR がライブラリの場合は `-RLIBDIR' を \fBDEPENDENCY_LIBS\fR に加える。 これは、そのライブラリが実行ファイルにリンクされるときに必ず \fILIBDIR\fR を実行ファイルの実行時パスに加えるためである。 .TP .B \-all\-static \fIOUTPUT\-FILE\fR がプログラムの場合は、 そのプログラムをどの共有ライブラリともリンクさせない。 \fIOUTPUT\-FILE\fR がライブラリの場合は静的ライブラリを作成するのみである。 .TP .B \-avoid\-version どのような種類のバージョニングも行わない (バージョン情報は組み込まれず、シンボリックリンクも作られない)。 このオプションはバージョニングを必要とするプラットホーム上では働かない。 .TP .B \-dlopen \fIFILE ホストプラットホーム上でネイティブな ダイナミックロードがサポートされていない場合や、 実行ファイルが \fB\-static\fR や \fB\-all\-static\fR を 使ってリンクされる場合は、\fB\-dlpreopen \fIFILE\fR と同じ。 それ以外の場合は何も影響を及ぼさない。 \fIFILE\fR が `実行ファイル自身' であった場合、 libtool は実行ファイルが \fB\-export\-dynamic\fR や \fB\-dlpreopen\fR を使って自らを \fBdlopen\fR(3) できるかを確かめる。 .TP .B \-dlpreopen \fIFILE \fIFILE\fR を出力プログラムにリンクし、そのシンボルを \fBLT_PRELOADED_SYMBOLS\fR に加える。 \fIFILE\fR が `出力プログラム自身' であった場合、 出力プログラム自身のシンボルが \fBLT_PRELOADED_SYMBOLS\fR に加えられる。 .TP .B \-export\-dynamic \fIOUTPUT\-FILE\fR のシンボルを \fBdlsym\fR(3) を使って解決できるようにする。 .TP .B \-export\-symbols \fIFILE これをサポートしているプラットホーム上では、 リンカは \fIFILE\fR にリストされているシンボルのみをエクスポートする。 \fIFILE\fR の名前は `.sym' で終っていなければならず、 1 行に 1 つのシンボルを含んでいなければならない。 デフォルトではすべてのシンボルがエクスポートされる。 .TP .B \-export\-symbols\-regex \fIREGEX \fIREGEX\fR \fBregex\fR(7) にマッチするシンボルのみがエクスポートされる以外は \fB\-export\-symbols\fR と同じ。 .TP .B \-module ダイナミックロードできるライブラリを作成する。 モジュール名は `lib' で始まる必要はないが、 名前の衝突を避けるため `libname' と `name' はパッケージの中で 同時に使用すべきではない。 .TP .B \-no\-undefined \fIOUTPUT\-FILE\fR が他のライブラリに依存していないことを宣言する。 他のライブラリに依存する共有ライブラリを作れないプラットホームもある。 .TP .B \-release \fIRELEASE ライブラリがパッケージのリリース \fIRELEASE\fR で作られたことを指定する。 これによって、ユーザーはどのバージョンが他のものより新しいかを 簡単に判断できる。 このフラグを使うと、パッケージの各リリースのいかなるペアの間にも バイナリ互換はなくなることに注意せよ。 バイナリ互換にしたい場合は、\fB\-version\-info\fR フラグを使うこと。 .TP .B \-rpath \fILIBDIR \fIOUTPUT\-FILE\fR がライブラリの場合、 最終的に \fILIBDIR\fR にインストールされる。 .TP .B \-static \fIOUTPUT\-FILE\fR がプログラムの場合、 アンインストールされた共有 libtool ライブラリはリンクしない。 \fIOUTPUT\-FILE\fR がライブラリの場合、 静的ライブラリを作成するのみである。 .TP .B \-version\-info \fICURRENT\fR[\fB:\fIREVISION\fR[\fB:\fIAGE\fR]] \fIOUTPUT\-FILE\fR が libtool ライブラリであるとき、 ライブラリをビルドするためにインターフェースバージョン情報 \fICURRENT\fR, \fIREVISION\fR, \fIAGE\fR を使う。 パッケージのリリース情報を指定するために、 このオプションを使っては\fBいけない\fR。 むしろ \fB\-release\fR フラグを参照すべきである。 .SS 実行モードオプション .TP .B \-dlopen \fIFILE \fIFILE\fR を含んでいるディレクトリをライブラリパスに加える。 .SH バージョニング .B libtool は共有ライブラリ用に独自のバージョニングシステムを持っている。 このシステムを使いたい場合は、\fB\-version\-info\fR オプションを 使わなければならない。 このオプションは \fICURRENT\fR[\fB:\fIREVISION\fR[\fB:\fIAGE\fR]] という形式の引数を受け付ける。 .TP .I CURRENT インターフェースのバージョン。インターフェースとは "外側" の世界に見えるすべてのもので、 変数・関数プロトタイプ・出力形式などである。 .TP .I REVISION \fICURRENT\fR からの相対値で与える実装のバージョン。 .TP .I AGE このライブラリが実装している最新のインターフェースと 最古のインターフェースとの違い。 言い替えると、このライブラリは `\fICURRENT \- \fIAGE\fR' から \fICURRENT\fR までの範囲のすべてのインターフェース番号を実装していて、 このバージョンの範囲にあるライブラリに対して過去にリンクされた すべての実行ファイルは、このライブラリを使うことができる、 ということである。 .PP \fIREVISION\fR と \fIAGE\fR が省略された場合のデフォルトは 0 である。 \fIAGE\fR は \fICURRENT\fR インターフェース番号より小さいか 等しくなければならないことにも注意すること。 2 つのライブラリが同一の \fICURRENT\fR 番号と \fIAGE\fR 番号であるとき、 ダイナミックリンカは大きい \fIREVISION\fR 番号のライブラリを選択する。 バージョニングのガイドライン: \fB\(bu\ 1.\fR それぞれの libtool ライブラリについて `0:0:0' というバージョン情報から始めなさい。 \fB\(bu\ 2. \fR バージョン情報を更新するのは ソフトウェアの公開リリースの直前だけにしなさい。 頻繁な更新は不必要であり、現在のインターフェース番号が大きくなるのを 早くするだけである。 \fB\(bu\ 3.\fR 前回の更新からライブラリのソースコードが すっかり変更されたなら、\fIREVISION\fR を増加させなさい (\fIC\fB:\fIR\fB:\fIA\fR が \fIC\fB:\fIR+1\fB:\fIA\fR になる)。 \fB\(bu\ 4.\fR 前回の更新からインターフェースが 追加・削除・変更されたなら、\fICURRENT\fR を増加させ、\fIREVISION\fR を 0 にしなさい。 \fB\(bu\ 5.\fR 前回の公開リリースからインターフェースが 追加されたなら、\fIAGE\fR を増加させなさい。 \fB\(bu\ 6.\fR 前回の公開リリースからインターフェースが 削除されたなら、\fIAGE\fR を 0 にしなさい。 パッケージバージョンをライブラリ名にエンコードしたい場合や、 \fBlibtool\fR のバージョニングと衝突せずに 他のバージョニングシステムを使いたい場合は、\fB\-release\fR を使うこと。 たとえば binutils\-2.7.0.2 に付属する `libbfd.so.2.7.0.2' は \fBlibtool\fR のバージョニングと明らかに衝突する。 `\-release 2.7.0' を使えば `libbfd\-2.7.0.so.0.0.0' で終ることができる。 異なる \fICURRENT\fR バージョンのライブラリや 異なる \fB\-release\fR のライブラリはバイナリ非互換であろう。 .SH インターフェースの設計 良いライブラリインターフェースを書くには、 練習とライブラリが解決しようとしている問題に対する徹底的な理解が必要である。 良いインターフェースを設計すれば、 頻繁に変更する必要はなく、ドキュメントを更新し続ける必要もなく、 クライアントがライブラリの使い方を再び勉強し続ける必要もないだろう。 設計に対するガイドラインをいくつか示す: \fB\(bu\fR 前もって計画を立てる .br エントリーポイントを頻繁に削除する必要がないように、 それぞれのインターフェースを最小にするようにしなさい。 \fB\(bu\fR インターフェースの変更を避ける .br もしインターフェースを再設計する必要があるならば、 クライアントが既に存在するコードを書き直す必要がないように、 互換性のある関数も残しておくようにしなさい。 \fB\(bu\fR 見えないデータタイプを使う .br クライアントがアクセスする必要のあるデータタイプの定義は少ない程良い。 可能ならば、関数がジェネリックポインタ (内部データタイプにキャストすることが可能) を 受け付けるように設計しなさい。 クライアントに直接データを操作させるよりは、 アクセス関数を提供しなさい。 このようするとインターフェースを変更することなく データ構造を自由に変更できる。 \fB\(bu\fR ヘッダファイルを使う .br それぞれのライブラリについて大域関数・大域変数をヘッダファイルに書いて ライブラリのソースファイルにインクルードしておけば、 気づかずにインターフェースの変更をしてしまっても コンパイラが知らせてくれるだろう。 \fB\(bu\fR 可能なときはいつでも\fB静的\fR (もしくは等価なもの) を使う .br ライブラリに大域関数が少ないほど、ライブラリは柔軟に変更できる。 \fB静的な\fR関数・変数は、クライアントがアクセスできないから インターフェースの変更とはならないので、好きなだけ変更することができる。 .SH AUTOMAKE ルールの書き方 \fBlibtool\fR ライブラリのサポートは、 \fBLTLIBRARIES\fR プライマリのもとに実装されている。 プログラムを \fBlibtool\fR ライブラリにリンクするためには、 ライブラリ名を指定する \fIprogram\fB_LDADD\fR 変数を使うこと。 libtool に \fB\-static\fR といったオプションを渡すためには \fIprogram\fB_LDFLAGS\fR を使うと良い。 \fBlibtool\fR ライブラリをビルドするには、 ライブラリ名を指定する \fIlib\fB_LTLIBRARIES\fR を使うこと。 \fBそして、たとえば、\fR\fBlibtool\fR に \fB\-version\-info\fR オプションを 渡すには \fIlib\fB_LDFLAGS\fR を使うこと。 次のセクションに例がある。 作業をするためには、パッケージにいくつかの基本的なファイルを入れたり、 \fBlibtoolize\fR を使う必要があるだろう。 \fBlibtool\fR スクリプトを直接インクルードしてはならない。 .TP .B config.guess 標準システム名を推測しようとする。 .TP .B config.sub 標準システム名を確認するサブルーチンスクリプト。 .TP .B ltconfig 指示されたシステムについて libtool スクリプトを作成する。 .TP .B ltmain.sh 基本的な libtool の機能を実装した一般的なスクリプト。 .SH モジュールのダイナミックロード \fBlibtool\fR のダイナミックロード機能を使うためには、 \fBconfigure.in\fR のなかで \fBAM_PROG_LIBTOOL\fR より前に マクロ \fBAC_LIBTOOL_DLOPEN\fR を使わなければならない。 さもなければ、\fBlibtool\fR はそのプラットホームには ダイナミックロードのメカニズムがないと仮定して、 これをシミュレートしようとする。 このシミュレーション機能を使うためには、 実行ファイルをリンクするときに \fB\-dlopen\fR と \fB\-dlreopen\fR フラグを使い、 ダイナミックロードするオブジェクトを宣言しなければならない。 \fBlibtool\fR はオブジェクトファイルをリンクし、 以下のような実行ファイルのシンボルテーブルを保持した データ構造を作成する。 .sp .RS .nf struct lt_dlsymlist { const char *NAME; lt_ptr_t ADDRESS; } .fi .RE .sp \fINAME\fR には、"fprintf" のような、シンボル名のアスキー文字列が保持される。 \fIADDRESS\fR は、&fprintf のような、 適切なオブジェクトへのジェネリックポインタである。 .sp .RS .nf const lt_dlsymlist * lt_preloaded_symbols; .fi .RE .sp この配列は実行ファイルにリンクされている プリロードされたシンボルを表す。 \fB\-dlpreloaded\fR されたファイルのそれぞれについて要素が存在し、 ファイル名 \fINAME\fR と `\fB0\fR' というアドレス \fIADDRESS\fR、 およびこのファイルからエクスポートされたすべてのシンボルを保持する。 実行ファイル自身については、特別な名前 \fB@PROGRAM@\fR が使われる。 最後のエレメントは \fINAME\fR と `\fB0\fR' という \fIADDRESS\fR を持つ。 ダイナミックロードされるライブラリもしくは、 モジュールをダイナミックロードしようとする実行ファイルをリンクするときは、 \fB\-module\fR フラグを指定するのを忘れないこと。 ダイナミックロードしようとしているライブラリの外部シンボルを、 実行ファイルが参照する必要がある場合は、実行ファイルをリンクするときに \fB\-export\-dynamic\fR を使用すること。 ライブラリ名にバリエーションがあるので、 プログラムはどれがダイナミックロードするための 正しいファイルであるのかを決定する必要がある。 直接的な方法は `\fB.la\fR' ファイルを調べて、 \fBdlname='\fIDLNAME\fB'\fR という行を探すことである。 この行はライブラリをダイナミックロードできない場合は空で、 そうでない場合はライブラリの名前が入っている。 .SH 例 ソースファイル `foo.c', `bar.c' から `libbaz' とよばれるライブラリを作成し、 次に `a' という名前の実行ファイルを作成するために `a.c' を `libbaz' と リンクしようといる。 .SS ライブラリの作成 \fB\(bu\fR コンパイルモード:Linux は共有ライブラリをサポートしているので、 \fBlibtool\fR は 2 つのオブジェクトファイル、 一つは静的ライブラリ (`foo.lo')、 もう一つは共有ライブラリ (`foo.o') を作成する。 ソースファイル自身へのリンクをコンパイラにやらせたくないので、 \fB\-c\fR オプションは必須である。 .sp .RS .nf 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 .fi .RE .sp \fB\(bu\fR リンクモード、静的ライブラリのみをビルドする: 以前に作成された `.o' というオブジェクトファイルを指定している。 \fB\-o\fR オプションは必須である。 .sp .RS .nf lightside:~% libtool cc -o libbaz.a foo.o bar.o ar cru libbaz.a foo.o bar.o ranlib libbaz.a .fi .RE .sp \fB\(bu\fR リンクモード、静的ライブラリと共有ライブラリをビルドする: `.lo' というオブジェクトファイルを指定する。 必須オプションは、前と同じ \fB\-o\fR と ライブラリのインストールされるディレクトリを指示する \fB\-rpath\fR である。 ライブラリは `.libs' ディレクトリに作成される。 .sp .RS .nf lightside:~% libtool cc \-o libbaz.la foo.lo bar.lo \e \-rpath /usr/local/lib cc \-shared \-Wl,\-soname \-Wl,libbaz.so.0 \e \-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) .fi .RE .sp \fB\(bu\fR インストールモード:ライブラリを指定したパス (この場合は `/usr/local/lib') にインストールするために 必要なコマンドを実行する。 このモードでは共有ライブラリ (`.so') と静的ライブラリ (`.a') を インストールするとともに、アンインストールと情報提供の目的で libtool ファイル (`.la') がインストールされる。 このモードはふつう特権ユーザーとして実行されるので、 \fB\-n\fR または \fB\-\-dry\-run\fR オプションを 指定して結果をチェックしておくとよい。 .sp .RS .nf 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 .fi .RE .sp .SS 実行ファイルの作成 最初に `a.c' をコンパイルする .sp .RS .nf cc \-c a.c .fi .RE .sp ライブラリが既にインストールされている場合には、 普段のように続行することができる .sp .RS .nf cc a.c \-lbaz \-L/usr/local/lib .fi .RE .sp ライブラリがまだインストールされていない場合は、 実行ファイルのリンク・デバッグ・インストールに \fBlibtool\fR を使用しなければならない (一度ライブラリがインストールされるまで、これはつづく)。 実際の実行ファイルはインストールされるまで `.libs' 内にあり、 作業ディレクトリにある実行ファイルは単なるラッパーであることに注意すること。 曖昧さを避けるため、絶対に \fB\-l\fR と \fB\-L\fR を使ってアンインストールされた 共有ライブラリにリンクしてはならない。 `.la' ファイルへのパスだけを指定すること。 以下の (`\-lm') でわかるように、インストール済みのライブラリは問題ではない。 .sp .RS .nf lightside:~% libtool cc a.o libbaz.la \-o a -lm cc a.o \-Wl,\-\-rpath \-Wl,/usr/local/lib \e .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 .fi .RE .sp .SS Makefile.am の作成 \fB\(bu\fR\ 最初に簡単な \fBconfigure.in\fR を作成し、 \fBautomake\fR と \fBlibtool\fR のためのマクロを忘れずに追加する。 .sp .RS .nf AC_DEFUN(AM_INIT_AUTOMAKE) AC_INIT(a.c) AM_INIT_AUTOMAKE(a, 1.0) AC_PROG_CC AM_PROG_LIBTOOL AC_OUTPUT(Makefile) .fi .RE .sp \fB\(bu\fR\ 対応する \fBMakefile.am\fR .sp .RS .nf # ライブラリのビルド 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 .fi .RE .sp \fB\(bu\fR\ そして最後に実行する .sp .RS .nf lightside:~% aclocal; libtoolize; automake \-\-add\-missing; autoconf lightside:~% ./configure; make .fi .RE .sp .SH 関連項目 \fBlibtoolize\fR(1), \fBlibltdl\fR(3) .SH 注意 プログラムのバグについては へ報告してください。 .br この man ページは Ragnar Hojland Espinosa が作成しました。