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

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>
       が作成しました。