Usage: libtool [OPTION]... [MODE-ARG]...
Provide generalized library-building support services.
--config show all configuration variables
--debug enable verbose shell tracing
-n, --dry-run display commands without modifying any files
--features display basic configuration information and exit
--mode=MODE use operation mode MODE
--preserve-dup-deps don't remove duplicate dependency libraries
--quiet, --silent don't print informational messages
--tag=TAG use configuration variables from tag TAG
-v, --verbose print informational messages (default)
--version print version information
-h, --help print short or long help message
MODE must be one of the following:
clean remove files from the build directory
compile compile a source file into a libtool object
execute automatically set library path, then run a program
finish complete the installation of libtool libraries
install install libraries or executables
link create a library or an executable
uninstall remove libraries from an installed directory
MODE-ARGS vary depending on the MODE.
Try `libtool --help --mode=MODE' for a more detailed description of MODE.
When reporting a bug, please describe a test case to reproduce it and
include the following information:
host-triplet: x86_64-unknown-linux-gnu
shell: /bin/sh
compiler: gcc
compiler flags: -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC
linker: /usr/bin/ld -m elf_x86_64 (gnu? yes)
libtool: (GNU libtool) 2.2.6b
automake: automake (GNU automake) 1.11.1
autoconf: autoconf (GNU Autoconf) 2.63
Report bugs to
Usage: libtool [OPTION]... [MODE-ARG]...
Provide generalized library-building support services.
--config show all configuration variables
--debug enable verbose shell tracing
-n, --dry-run display commands without modifying any files
--features display basic configuration information and exit
--mode=MODE use operation mode MODE
--preserve-dup-deps don't remove duplicate dependency libraries
--quiet, --silent don't print informational messages
--tag=TAG use configuration variables from tag TAG
-v, --verbose print informational messages (default)
--version print version information
-h, --help print short or long help message
MODE must be one of the following:
clean remove files from the build directory
compile compile a source file into a libtool object
execute automatically set library path, then run a program
finish complete the installation of libtool libraries
install install libraries or executables
link create a library or an executable
uninstall remove libraries from an installed directory
MODE-ARGS vary depending on the MODE.
Try `libtool --help --mode=MODE' for a more detailed description of MODE.
When reporting a bug, please describe a test case to reproduce it and
include the following information:
host-triplet: x86_64-unknown-linux-gnu
shell: /bin/sh
compiler: gcc
compiler flags: -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC
linker: /usr/bin/ld -m elf_x86_64 (gnu? yes)
libtool: (GNU libtool) 2.2.6b
automake: automake (GNU automake) 1.11.1
autoconf: autoconf (GNU Autoconf) 2.63
Report bugs to
LIBTOOL(301) LIBTOOL(301)
名前
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 オプションを指定すると、たとえ --dis-
able-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-ARGS を cp(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 までの範囲のすべてのインターフェース番号を実装
していて、このバージョンの範囲にあるライブラリに対して過去にリン
クされたすべての実行ファイルは、このライブラリを使うことができる
、ということである。
REVISION と AGE が省略された場合のデフォルトは 0 である。 AGE は CUR-
RENT インターフェース番号より小さいか等しくなければならないことにも注意
すること。 2 つのライブラリが同一の CURRENT 番号と AGE 番号であるとき、
ダイナミックリンカは大きい REVISION 番号のライブラリを選択する。
バージョニングのガイドライン:
· 1. それぞれの libtool ライブラリについて ‘0:0:0’ というバージョン情報
から始めなさい。
· 2. バージョン情報を更新するのはソフトウェアの公開リリースの直前だけ
にしなさい。頻繁な更新は不必要であり、現在のインターフェース番号が大 き
くなるのを早くするだけである。
· 3. 前 回 の更新からライブラリのソースコードがすっかり変更されたなら
、REVISION を増加させなさい (C:R:A が C:R+1:A になる)。
· 4. 前回の更新からインターフェースが追加・削除・変更されたな ら 、CUR-
RENT を増加させ、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_LTLI-
BRARIES を使うこと。そして、たとえば、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’ を ‘lib-
baz’ とリンクしようといる。
ライブラリの作成
· コンパイルモード: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 を作成し、 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)
· 対応する 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)
注意
プログラムのバグについては
Copyright(C) linux-cmd.com All Rights Reserved. Author Takayuki Yukawa