From: WATANABE Hirofumi Date: 2002-11-13T15:49:53+09:00 Subject: [ruby-dev:18763] Re: reference to symbols in other ext. libraries わたなべです。 nobu.nakada@nifty.ne.jp writes: > すいません、うっかりしてました。これは戻しましょうか。しかし > extmk.rbとmkmf.rbで分けるというのもあまりすっきりしなくはあるの > ですが。 もともとext/配下のtypo等のうっかりミスを早期に発見するために つけたようなものなので、すっきりしなくていいのです(かなりこじつけ)。 とりあえず戻してください。 > > そうですか。危ういやり方であるとは認識していましたが。 > > 思いつく解決法は次の2つくらいですが、どうでしょうか? > > 「EXTERNの仕組み」というのを全然理解していないので、 > > 解決法になってないのかもしれませんが。 > > たぶんWindowsのDLLのシンボルが、import/exportのように対称的じゃ > ないという話じゃないかと思いますが。 現在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を作らないといけないし。 > > * libruby(にある何らかの関数・変数)を介して明示的にシンボルを > > 登録・検索できるようにする。例えば、ポインタを適当にラップ > > して、GCされないようにしたHashオブジェクトに突っ込むなど。 > > これでよければ、classなりmodule自身のインスタンス変数とか定数と > かでできそうです。 個人的にはポインタを持つのではなく面倒でもwrapper methodを用 意して、Ruby側で解決してもらうほうがいいかなあ。 > > * 他の拡張ライブラリに見せる部分は独自のDLLにしてインストール。 > > 参照する側の拡張ライブラリではlibrubyに加えこのDLLもリンクする。 > > リンク時にシンボル解決ができるのは嬉しいが、別DLLを作る方法が問題。 > > これだとEXTERNの問題は解決しないかも知れません。 いや、これならごく普通のDLLを使う方法と同じなので問題ありません。 #でもあまりやりたくない方法でしょうね。 -- わたなべひろふみ