2009/04/13

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

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

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


次にXSソース(libcXS.xs)を編集します。
  1. #include "EXTERN.h"  
  2. #include "perl.h"  
  3. #include "XSUB.h"  
  4.   
  5. #include "ppport.h"  
  6.   
  7. #include "stdlib.h"  
  8.   
  9. MODULE = libcXS  PACKAGE = libcXS    
  10.   
  11. void  
  12. puts(value)  
  13. 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 件のコメント: