2009/04/13

XSからlibcのputs関数を呼び出す

前回はCのコードをxsコードに書いて、それを実行するということをやりました。
今回は外部のCライブラリを呼び出してみたいと思います。
一番簡単そうな例として、libcのputs関数を呼び出してみます。

まずはXSライブラリのひな形を作成します。
$ h2xs -A -n libcXS
perl Makefile.PL


次にXSソース(libcXS.xs)を編集します。
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#include "stdlib.h"

MODULE = libcXS PACKAGE = libcXS

void
puts(value)
char * value

追記したのは、include部にstdlib.hを追加したのと前回も追加した関数の戻り値などの定義部分です。
前回のようCODEセクションを定義してコードを書かなくても、既存のライブラリ呼び出しの場合は定義だけでOKです。

最後にmakeして完了です。

実際にこのモジュールを使ったPerlコードを使った例が次のものです。
標準出力にhogehogeと表示されるはずです。
#!/usr/bin/perl

use strict;
use ExtUtils::testlib;
use libcXS;

libcXS::puts("hogehoge");


だんだんわかってきたような気がしてきていますが、きちんと理解するためにはもう少し時間がかかりそうです。
ひとまず、perldoc perlxsとモダンPerl入門を改めて読んでみます。

----
追記:
なぜか、#include "stdlib.h"を消しても動きます…
前段階でincludeされてるのかなぁ、それとも別の原因…?
今度は違うライブラリでやってみたいと思います。

0 件のコメント: