LuaからC言語を呼び出す

 C言語の呼び出しが簡単なのがLuaの良いところ。tolua++というツールもあり、本当に楽です。(tolua++は後でファイル置き場に置こうと思ってます。)



■手順はこんな感じです。

C言語ヘッダとソース書く。

②ヘッダから公開したいもの切り出し、pkgファイルに。

③tolua++起動し、LuaとCをつなぐグルーコードを作る。

④グルーコード含めたC言語をDLL(so)にする。

Luaから呼び出す。


ただし、普通、プログラム書いたらビルドしないといけないですよね?①、④はそれと同じなので、CとLuaと連携する正味のコストというべきものは②と③だけなんです。ところが、この②、③がまたイイ!!むしろ、気持ちよくなるくらいのラクチンさなんですよ。。。ぜひ、試してみてほしいんです。



以下で、少しやってみましょう。



C言語のヘッダとソースを書く

次のようなC言語ソース書いてみます。

Luaで呼びたい関数はhello()です。(てか、これしかありません。)



ファイル:cfunc.h

#ifndef __CFUNC_H__
#define __CFUNC_H__

//helloの宣言
extern int hello( int i );

#endif //__CFUNC_H__



ファイル:cfunc.c

#include <stdio.h>
#include "cfunc.h"
//helloの中身
int hello( int i )
{
	printf( "hello %d\n" , i );
	return i;
}





②ヘッダから公開したいもの切り出し、pkgファイルに。

これだけ用意したら、Luaに公開したい内容でpkgファイルを作ります。といってもhello()しかないので、そのままコピーです。pkgファイルのexternがついている内容がLua側で利用できるようになります。

ファイル:cfunc.pkg

extern int hello( int i );



これだけのファイルです。コピーしただけです。ね、本当に簡単でしょ?





③tolua++を起動し、グルーコード作成

私はmingw+msys環境なので、次のようにしました。

ちなみに-Hはグルーコードのヘッダファイル、-oはグルーコードを作れって指示です。ヘッダは使うかどうかわかりませんが、こうするものとワンパターンにしておきます。


>tolua++.exe -n cfunc -H cfunc_glue.h -o cfunc_glue.c cfunc.pkg


この毎回のパターン、tolua++ -H 作りたいグルーのヘッダ -o 作りたいグルー pkgファイルだけ覚えてください。このワンパターンの呪文さえ唱えれば、魔法のコードが生成されるんです。本当に簡単です。





④グルーコード含めたC言語をDLL(so)にする。

私の環境では下記のごとくしました。要するにグルーコードも含んだDLLを作っておけという話です。


$ gcc -Wall -shared cfunc.c cfunc_glue.c -o cfunc.dll -I/[tolua++のパス]/include -I/[Luaのパス]/include [Lua/binのパス]lua5.1.dll tolua++.dll
まぁ、いつものビルドっすよ。





Luaから呼び出す。

callc.lua

-- cfunc.dllをロードする
require( "cfunc" )
-- cfunc.dll中のhello()を呼ぶ<br>
hello( 10 )



一気に書いてしまったので、「うげぇぇ、大変じゃん。嘘つくなよ」と思うかもしれませんが、よく考えて見ましょう。pkgファイルを作ったところや、tolua++を使ったところが普段より、ひと手間多いですが、これは頭を使わずにできます。本当に楽ですよ。

とにかく一度、試してみましょう。なんでもLuaにしたくなってくるはずです。物置にtolua++(mingw用)をアップしましたので、ぜひ、お試しください。

[物置]

http://d.hatena.ne.jp/kitfactory/20100511/1273597448





さらに詳しくは理解したい方は、

[tolua++ リファレンスマニュアル]

http://www.codenix.com/~tolua/tolua++.html