Previous: Module loaders for libltdl, Up: Using libltdl
libltdlはlibtoolとともにインストールされるのですが,libtoolやlibltdlを
インストールしていないパッケージユーザの利便性のため,パッケージの配布
物にlibltdlを含めたいと思うかもしれません.この場合,手動でパッケージ
に加えるltdl
オブジェクト,または,使用したいlibltdlの特色を決定
する必要があります.それは,コンビニエンスライブラリやインストール可能
なlibtoolライブラリです.
libltdl
をッケージに加える最も簡単な方法は,ソースファイルの
ltdl.cとltdl.hをパッケージのソースディレクトリにコピーし,
ソースの残りと一緒にリンクすることです.これの手助けをするため,
autoconfのm4マクロがltdl.m4で利用可能です.autoconfを実行する前
に,それらがaclocal.m4で利用可能かどうかを確かめる必要がありま
す – automakeを使用している場合はltdl.m4の内容を
acinclude.m4に加え,そうでない場合はaclocal.m4に加えます.
マクロを利用可能にした後,ltdl.oを正しくビルドするために必要な
コンフィグレーション時の調査を実行するため,‘AC_LIB_LTDL’マクロの
呼び出しを,パッケージのconfigure.inに加える必要があります.イ
ンストールされているlibltdl やlibltdlに依存しているライブラリと,パケー
ジのバイナリをリンクしようとする場合,この手法には問題があります.シン
ボルの二重定義の問題があるかもしれません.
コンビニエンスライブラリの利点の一つは,インストールされていないという ことなので,libtoolを使用するという事実はユーザにとって明白ではなく, ユーザが以前にインストールしているlibtoolのバージョンを上書きしません. 一方,(例えば,バグフィックスといった)理由があって,libltdlをアップグ レードしたい場合,インストールされているバージョンのlibtoolを置き換え る代わりに,パッケージを再コンパイルする必要があります.しかし,プログ ラムやライブラリが以前にインストールされているバージョンのlibltdlを使 用しているライブラリとリンクする場合,リンカエラーが発生し実行時にクラッ シュするかもしれません.もう一つの問題は,一つ以上のlibtoolライブラリ へコンビニエンスライブラリをリンクできないことで,複製されたシンボルを 得る可能性があるので,そのときは,これらのライブラリを用いた単一のプロ グラムとリンクしてください.一般的に,libtoolを使用している他のライブ ラリに依存しないプログラムでは,コンビニエンスライブラリを問題なく使用 可能です.libltdlのこの特徴を利用可能にするため, ‘AC_LIBLTDL_CONVENIENCE’行をconfigure.inに, ‘AC_PROG_LIBTOOL’の前に加えた方が良いでしょう.
インストール可能なバージョンのlibltdlを選択するために,マクロ ‘AC_LIBLTDL_INSTALLABLE’の呼び出しをconfigure.inに, ‘AC_PROG_LIBTOOL’の前に加えた方が良いでしょう.このマクロ は,libltdlが既にインストールされているかどうか調査し,そうでない場合, ビルドしインストールされるパッケージlibltdlを埋め込むことを要求します. しかし,バージョン調査は実行されないことに注意してください.ユーザは, コンフィグレーションスイッチ‘--enable-ltdl-install’を使用すること で,他のバージョンの存在に関係なく,テストを優先し,埋め込まれた libtoolをインストールする必要があるか決定することができます.
libtoolをパッケージに埋め込むため,libtoolize
コマンドラインに
‘--ltdl’のみ加えてください.それで,パッケージのサブディレクトリ
‘libltdl’にlibtoolのソースをコピーします.どちらのマクロも,
‘libltdl’ディレクトリの位置を指定する追加の引数を受け入れます.デ
フォルトで,どちらのマクロも‘${top_srcdir}/libltdl’を仮定します.
どのマクロを使用しても,configure.inは‘AC_CONFIG_SUBDIRS’ を使用して,libltdlをコンフィグレーションし,Makefileが,例えば, automakeのSUBDIRSを使用して,libtoolのディレクトリでサブmakeを開 始することを確実にするのはあなたです.どちらのマクロも,libltdlでリン クするために使用するリンクフラグのシェル変数LIBLTDLと, ltdl.hをインクルードするプログラムをコンパイルするために使用す るプリプロセッサフラグLTDLINCLを定義します.この変数が Makefileで利用可能にすることを確実にするため‘AC_SUBST’を使 用したり,デフォルトで‘AC_SUBST’される,LIBSと CPPFLAGSのような変数に加えるのはあなた次第です.
コンビニエンスlibltdlを使用している場合,LIBLTDLはコンビニエンス libltdlのバージョンに対するパス名で,LTDLINCLはlibltdlを含むディ レクトリが続く‘-I’になり,どちらも‘${top_builddir}/’,また は,‘${top_srcdir}/’で,それぞれ始まります.
インストールされているlibltdlのバージョンを要求し,それが見つかった場 合1,LIBLTDLは ‘-lltdl’に,LTDLINCLは空に設定されます(それは,libltdlがラ イブラリパスにある場合,ltdl.hがインクルードパスのどこかにある という,暗黙の仮定です).インストール可能なlibltdlのバージョンをビルド する必要がある場合,‘${top_builddir}/’で始まるそのパス名は, LIBLTDLに保存され,LTDLINCLはコンビニエンスライブラリの場 合と同様に設定されます.
そのため,libltdlとプログラムをリンクしたいときは,それをインストール された,またはインストール可能なコンビニエンスライブラリにし,すなわち, libtoolを使用して,LTDLINCLを用いてコンパイルし, ‘$(LIBLTDL)’を用いてリンクしてください.
おそらく‘AC_LIBTOOL_DLOPEN’もconfigure.inに, ‘AC_PROG_LIBTOOL’の前に加えた方が良く,そうしない場合は, libtoolはdlopenメカニズムがサポートされていないと仮定し,おそらく希望 していないdlpreopenに逆戻りします.
libltdlとプログラムをリンクするとき,-static
や
-all-static
スイッチの使用を避けてください.dlopen関数はスタティッ
クリンクに対して利用可能でない可能性があるので,これはすべてのプラット
フォームで動作するわけではありません.
以下の例は,パッケージにコンビニエンスlibltdlを埋め込む方法を示します. インストール可能な形態を使用するために,‘AC_LIBLTDL_CONVENIENCE’ を‘AC_LIBLTDL_INSTALLABLE’で置換してください.我々は,libltdlが ‘libtoolize --ltdl’を使用して埋め込まれていると仮定しています.
configure.inは以下のようになります.
... dnl Enable building of the convenience library dnl and set LIBLTDL accordingly AC_LIBLTDL_CONVENIENCE dnl Substitute LTDLINCL and LIBLTDL in the Makefiles AC_SUBST(LTDLINCL) AC_SUBST(LIBLTDL) dnl Check for dlopen support AC_LIBTOOL_DLOPEN dnl Configure libtool AC_PROG_LIBTOOL dnl Configure libltdl AC_CONFIG_SUBDIRS(libltdl) ...
Makefile.amは以下のようになります.
... SUBDIRS = libltdl INCLUDES = $(LTDLINCL) myprog_LDFLAGS = -export-dynamic # The quotes around -dlopen below fool automake <= 1.4 into accepting it myprog_LDADD = $(LIBLTDL) "-dlopen" self "-dlopen" foo1.la myprog_DEPENDENCIES = $(LIBLTDL) foo1.la ...
[1] たとえ,libltdlがインストールされていても,libltdlがCライ ブラリ以外のライブラリが提供するシンボルに依存する場合, ‘AC_LIBLTDL_INSTALLABLE’は検出に失敗する可能性があります.この場 合,libltdlのビルドとインストールは不必要です.