[Gauche-devel-jp] ext/* 以下のヘッダファイル

Zurück zum Archiv-Index

Shiro Kawai shiro****@lava*****
2009年 8月 21日 (金) 16:26:21 JST


WiLiKiのGauche:Bugsに何ヶ月か前に次のエントリをいただいてたんですが、
あちらに書き込んでも埋もれてしまいそうなので(放置しててすみません)
こちらで取り上げます。

<quote>
koguro(2008/12/29 20:32:16 PST): Gaucheをmake installしたときに
gauche/threads.hがコピーされません。Cからアクセスしたいので、特に問題な
ければコピーしてもらえるとうれしいです。あと他にもcharconv.hなどext配下
のヘッダファイルでコピーされないものがあるようです。
</quote>

ext以下の*.soや*.dllとして提供されるC関数を、別のCライブラリルーチン
から呼ばせるというのは、unixでは全然問題ないんですが、Windowsで
ちゃんとサポートするのがやたら面倒だったので、とりあえずサポートしないよ、
という意志表示として今のところ*.hをインストールしていません。

呼ぶ方法として、
(1) *.dllを普通のライブラリとしてリンクする
(2) LoadLibrary/GetProcAddressで実行時動的リンクして呼び出す
という方法があると思うんですが、

(1)だと、autoimport/autoexport絡みでソースがごちゃごちゃするのと、
リンク時にdll名を指定しなければならないなどunix側と作法が違って
ビルドプロセスもごちゃごちゃするので、あまり触りたくないところです。

(2)の場合は、関数のプロトタイプ宣言だけでは足りなくて、
GetProcAddressで得たアドレスをキャストする「API関数へのポインタの型」が
提供されている必要があります。OpenGLのGL/gl.hなどがそんなふうに
なってますね。具体的には、

extern ScmObj Scm_ThreadStart(ScmVM *vm);
typedef ScmObj (ScmThreadStartProc)(ScmVM *vm);

みたいに全てのAPIにtypedefを付随させて、使う側で

  ScmThreadStartProc *pf = (ScmThreadStartProc*)GetProcAddress(...);
  pf(vm);

とする、ということです。
 
koguroさんの欲しいのは(2)のほうかなと思います。こちらはヘッダファイルが
ごちゃごちゃするものの、ビルドプロセスには影響を与えないので、
サポートするとしたらそっちの方向かなと思います。

…というのが今のところの状況なのですが、koguroさんの「Cからアクセスしたい」
という要望を満たすのに、この方針で良いでしょうか。

なお、歴史的経緯から、gauche.uvectorはext以下のdllは普通のライブラリと
してはリンクさせない、という方針の例外になってます。
これについてもuvectorの基本APIがコアの方に入ったので、将来的には
他のdllと同様、LoadLibrary専用に変更する予定です。

--shiro




Gauche-devel-jp メーリングリストの案内
Zurück zum Archiv-Index