〜 Perlモジュールの作り方 (C言語編) 〜

 

※ ここではFreeBSD 4.10を元に記してあります。

 

  1. h2xs コマンドでモジュールの雛形を作る。

    例えば "Mytest" という名前のモジュールを作る場合
     
    % h2xs -A -n Mytest

     

    Mytest フォルダが作成され、
    Mytest.pm、Mytest.xs、Makefile.PL、test.pl、Changes、MANIFEST ファイルが
    生成される。


     

  2. 生成されたXSファイルに専用の記述を含めてCコードを追記する。

    Mytest.xs にインターフェースとなる(Perlから呼び出す)関数を追加する。
     
    #include "EXTERN.h"
    #include "perl.h"
    #include "XSUB.h"

     
      この位置にはインターフェースとならないCソースコードを追加できます。

    正しいファイル構成とかを考えたりするのが面倒な場合は、ここに全部入れちゃうのも手かも。

    #include "my_func.c"
     ↑ これもありw

    MODULE = Mytest PACKAGE = Mytest

     


    void
    hello()
        CODE:
            printf("Hello, world!\n");
    (追加例1)
    戻り値の型
    関数名
        コードの開始宣言

      

    int
    my_func(input1, input2)
        int input1
        char* input2
        CODE:
            RETVAL = input1 / 2;
            printf("%s\n", input2);
        OUTPUT:
            RETVAL
    (追加例2)
    戻り値の型
    関数名(引数に型を付けない)
        引数リスト
        コードの開始宣言



        戻り値の開始宣言

     



     
  3. Makefile を生成する。
     
    % perl Makefile.PL

     


     
  4. makeする。
     
    % make

     


     
  5. 呼び出してみる。

    適当なPerlファイルを作成してテストする。
     
    #!/usr/local/bin/perl

    use ExtUtils::testlib;
    use Mytest;

    Mytest::hello();
    Mytest::my_func(10, "abc");

     


    ※ make環境以外で実行するには、生成された Mytest.pm、Mytest.so
      インストールされているか、カレントに必要です。

 


〜 ヒント集 〜

C関数から数値以外の情報を返したい。

 1つの数値ならリターン値で返せば済みますが、例えば文字列を生成してそれをPerl側で得るにはどうすればよいでしょうか?
 
 (1)モジュール関数の引数に「 char* 」を追加する。
    ここには格納に必要なバッファ領域が設定されると仮定する。

    この方法を利用する上で、その他の文字列渡しを「 const char* 」としておけば見分けやすくなると思います。

 (2)Cソース側でバッファに生成した文字列を格納する。
    パラメータチェックでバッファ文字列の長さをチェックしてから格納すること。

 (3)呼び出す側(Perl)で下記のように変数を用意してパラメータとして渡す。
    my $buff = "          \0";    # スペース文字10個と\0。10Byte分の文字列を格納できるバッファ


 ※ この方法はPerl側の文字列領域を「書き換える」ことで実現します。
   文字コード等で1文字のバイトサイズが違うことに注意してください。

 


Copyright(C) RainyLain 2000, 2005