Shiro Kawai
shiro****@lava*****
2003年 10月 3日 (金) 16:37:26 JST
From: Kimura Fuyuki <fuyuk****@nigre*****> Subject: Re: [Gauche-devel-jp] Cとの連携 Date: Fri, 03 Oct 2003 12:01:52 +0900 > 今ちょっと困っているのは、拡張モジュールから <sockaddr> オブジェクトを > 作るのにどうしようかということです。Gauche が ext/net.h をインストール > してくれれば、それを参照して Scm_MakeSockAddr を呼べるんでしょうか? ああ、そうですね。0.7.2ではnet.hもインストールするようにします。 拡張モジュールXで定義されているC関数を別の拡張モジュールYから呼ぶ 場合、注意する点がいくつかあります。 まず、システムによってはYの作成時にシンボルを全て解決することを 要求される場合があります。私のアクセスできる環境ではcygwinだけなんですが。 この場合、Yのリンク時(Y.dll作成時)に -lX を指定する必要があります。 従って、X自体は libX.dll となっていなければならず、かつそれが存在する パスが-Lであたえられている必要があります。 (この点を吸収するうまい方法をまだ考え付かないので、拡張モジュールから 拡張モジュールを呼ぶ方法の仕様を決めかねています) そうでない、大抵のUnixでは、XのヘッダだけあればY.soをコンパイルして 作成できますが、実行時にY.soより前にX.soをロードしておく必要が あります。通常は拡張モジュール自体がSchemeのモジュール定義ファイル からdynamic-loadでロードされるので、Schemeレベルでこんなふうに しておけば大丈夫です。 (define-module Y (use X)) (dynamic-load "Y") また、拡張モジュールによってはCの関数は入出力に仮定を置いていて、 Schemeで定義された高レベル関数の方でその仮定を満たすことをチェック しているかもしれません。そのような場合には、Cの関数を直接呼ぶと 良くないことが起こるかもしれません (まあこれは、どんな内部関数を 呼ぶ場合にも当てはまる注意ですが)。 --shiro