dlopen
可能なモジュールの作成libtoolモジュールは,いくつかの例外はありますが,通常のlibtoolライブラ リに似ています.
libtoolの‘-module’スイッチを用いて,モジュールとリンクする必要が あり,そして,dlopenをサポートしていないプラットフォームでlibtoolが dlpreopenできるよう,‘-dlopen modulename.la’を用いてモジュールを dlopenするために,あらゆるプログラムとリンクすべきです.モジュールが, あらゆる他のライブラリに依存する場合,モジュールとリンクするときや,そ れをdlopenするプログラムをリンクするとき,それらを確実に指定してくださ い.特定のモジュールに対しsee Versioningを使用禁止にしたい場合, ‘-avoid-version’スイッチを用いてリンクすべきです.libtoolモジュー ルは,"lib"接頭辞が不要なことに注意してください.しかし,automake 1.4 やそれ以降のものは,そのようなモジュールのビルドが必要です.
通常,その内部を知る必要なしにプログラムがdlopenできるよう,一組のモ ジュールは同じインターフェース提供し,すなわち同じシンボルをエクスポー トします.すべてのエクスポートされたシンボルで,シンボルの衝突を避ける ため,"modulename_LTX_"を前置する必要があります(‘modulename’はモ ジュール名です).内部シンボルは,例えば"_modulename_"を前置するといっ た,他のモジュールと衝突しないような方法で命名する必要があります.一回 以上宣言された,同じシンボルを持つことをサポートするシステムもあります がそれは通常移植性がなく,そのようなモジュールをdlpreopenすることを不 可能にします.libltdlは,シンボルの本当の名前を得るとき,自動的に接頭 辞を切り取ります.さらに,非libtoolモジュールもdlopenできるよう,接頭 辞を使用していないモジュールをサポートします.
foo1.cは移植可能なlibtoolモジュールの例です.エクスポートされた シンボルは"foo1_LTX_",内部シンボルは"_foo1_"が前置されています.コー ドの可読性を高めるため,エイリアスは最初に定義されています.
/* aliases for the exported symbols */ #define foo foo1_LTX_foo #define bar foo1_LTX_bar /* a global variable definition */ int bar = 1; /* a private function */ int _foo1_helper() { return bar; } /* an exported function */ int foo() { return _foo1_helper(); }
Makefile.amは,モジュールfoo1.laをビルドするのに必要な規 則を含んでいます.
... lib_LTLIBRARIES = foo1.la foo1_la_SOURCES = foo1.c foo1_la_LDFLAGS = -module ...