ノード:Modules for libltdl, 次:, 前:Libltdl interface, 上:Using libltdl



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
     ...