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