From: Hiroshi IGARASHI Date: 2002-11-17T00:24:02+09:00 Subject: [ruby-dev:18813] Re: reference to symbols in other ext. libraries いがらしです。 At Wed, 13 Nov 2002 15:49:53 +0900, WATANABE Hirofumi wrote: > > 現在win32/win32.hでは > > #if defined(IMPORT) > #define EXTERN extern __declspec(dllimport) > #elif defined(EXPORT) > #define EXTERN extern __declspec(dllexport) > #endif > > となっているので、拡張ライブラリ側ではexportできません > (-DIMPORTしてるので)。 > *.defを使えばいいとも言えますが、それだとWindowsにしか通用し > ないので、なんらかの方法が必要だと思います。 > あと、import libraryを作らないといけないし。 一筋縄ではいかないようですね。 cyngwin限定だとは思いますが、libtoolはこういった問題を うまく解決しているんでしょうか? > > > > * libruby(にある何らかの関数・変数)を介して明示的にシンボルを > > > 登録・検索できるようにする。例えば、ポインタを適当にラップ > > > して、GCされないようにしたHashオブジェクトに突っ込むなど。 > > > > これでよければ、classなりmodule自身のインスタンス変数とか定数と > > かでできそうです。 > > 個人的にはポインタを持つのではなく面倒でもwrapper methodを用 > 意して、Ruby側で解決してもらうほうがいいかなあ。 他の拡張ライブラリにあるC関数を、Rubyオブジェクトのメソッド 呼び出しにより間接的に呼び出すということですよね。 オーバーヘッドもありますが、Ruby/GNOMEの場合、一度インタプリタに 制御が渡るという点が問題になりそうな気がします(気がするだけかも)。 > > > > * 他の拡張ライブラリに見せる部分は独自のDLLにしてインストール。 > > > 参照する側の拡張ライブラリではlibrubyに加えこのDLLもリンクする。 > > > リンク時にシンボル解決ができるのは嬉しいが、別DLLを作る方法が問題。 > > > > これだとEXTERNの問題は解決しないかも知れません。 > > いや、これならごく普通のDLLを使う方法と同じなので問題ありません。 > #でもあまりやりたくない方法でしょうね。 ですね。 具体的にどうするかは私だけでは判断がつかないので、 Ruby/GNOMEのMLに振ってみます。 -- 五十嵐 宏 (Hiroshi IGARASHI)