Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. XS
  3. here

C言語のライブラリをXSファイルから読み込む方法

C言語のライブラリをXSファイルから読み込む方法を解説します。

h2xsでモジュールを作成

最初にh2xsでXS用のモジュールを作成します。

h2xs -A -n SomeModule

こうすると「SomeModule」というディレクトリが作成されます。次のようなファイルとディレクトリが作成されます。

Changes
lib/
Makefile.PL
MANIFEST
ppport.h
README
SomeModule.xs
t/

C言語のライブラリの作成

まずC言語のライブラリを作成しましょう。ヘッダファイルとソースファイルを作成します。

mylib.h

ヘッダファイルです。mylib_printを宣言しています。

void mylib_print();

mylib.c

ソースファイルです。mylib_printは「mylib」という文字列を出力する関数です。

#include <stdio.h>

void mylib_print() {
  printf("mylib\n");
}

ヘッダファイルとソースファイルは保存して、XSファイルが存在するディレクトリと同じディレクトリに配置してください。同じディレクトリにおいておくのが、後の設定が少なくて観点です。

XSファイルの記述

XSファイルを記述しましょう。mylib_printを呼び出しています。

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"
#include "mylib.h"

MODULE = SomeModule		PACKAGE = SomeModule		

void
foo(...)
  PPCODE:
{
  mylib_print();
  XSRETURN(0);
}

Makefile.PLの修正

次にMakefile.PLを少し修正しましょう。一番下の「OBJECT」オプションがデフォルトではコメントアウトされているので、コメントを取り除きます。「$(O_FILES)」という設定をすれば、カレントディレクトリのすべてのC言語ソースファイルがコンパイルの対象になります。

use ExtUtils::MakeMaker;

WriteMakefile(
    NAME              => 'SomeModule',
    VERSION_FROM      => 'lib/SomeModule.pm', # finds $VERSION
    PREREQ_PM         => {}, # e.g., Module::Name => 1.1
    ($] >= 5.005 ?     ## Add these new keywords supported since 5.005
      (ABSTRACT_FROM  => 'lib/SomeModule.pm', # retrieve abstract from module
       AUTHOR         => 'A. U. Thor <kimoto@sakura.ne.jp>') : ()),
    LIBS              => [''], # e.g., '-lm'
    DEFINE            => '', # e.g., '-DHAVE_SOMETHING'
    INC               => '-I.', # e.g., '-I. -I/usr/include/other'
    OBJECT            => '$(O_FILES)', # link all the C files too
);

テストスクリプト

テストスクリプトを作成します。これは、XSファイルがあるディレクトリと同じディレクトリにおいてください。

use strict;
use warnings;

use SomeModule;

SomeModule::foo();

コンパイルして実行

コンパイルして実行してみましょう。

perl Makefile.PL
make
perl -Mblib test.pl

次のように出力されれば成功です。

mylib

これで、C言語のライブラリをXSファイルから読み込むことができるようになりました。