ext/net.h (Re: [Gauche-devel-jp] Cとの連携)

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











Gauche-devel-jp メーリングリストの案内
Back to archive index