いがらしです。

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)