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