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ファイルから読み込むことができるようになりました。

Perlの書籍
  • 初めてのPerl 第7版

    Perl入門 定番の一冊
  • 業務に役立つPerl

    ログ解析など日本語を含むテキスト処理の実践!
  • 詳説 正規表現

    正規表現の詳細な解説
  • Perlの書籍販売 14冊 »
自己紹介
木本裕紀(きもとゆうき)

Twitter

フォロー、いいね、リツート、コメント歓迎

Youtube

チャンネル登録、いいね、コメント歓迎
Perlの求人広告募集中