C与lua交互时通过栈的方式来完成,lua调用C函数时,需要同样的通过压栈出栈来完成数据交互。
使用tolua++,简化这个流程,我们可以方便的让lua调用C,原理是通过pkg文件定义C暴露给lua的接口。当然tolua++也支持C++,不过出于简单考虑,我只使用C函数接口。
tolua++官网:http://www.codenix.com/~tolua/
1.安装tolua++
我使用的版本是1.0.93,
按照INSTALL文档说明编译安装,
编译tolua++需要先安装scons,下载地址:http://www.scons.org/download.php,使用rpm包安装,rpm -ivh scons-2.1.0-1.noarch.rpm
安装完scons之后,解压tolua++
到tolua++目录下执行scons,完成安装。
2.如何使用tolua++
tolua++的src文件夹下有test目录,演示如何使用lua调用C/C++,不过貌似最简单的tarray测试,assert失败。
定义一个test.pkg文件,tolua++将会使用该文件生成lua调用C函数的实现文件,pkg文件格式跟.h文件很相似,一般情况下,只需要声明C函数,包含test.h文件,test.c为实现具体业务的文件。
例如:interface.pkg文件
$#include "interface_c.h"
int add(int x, int y);
int sub(int x, int y);
module log
{
void write_log(int level, char* msg);
}
interface_c.h
int add(int x, int y);
int sub(int x, int y);
//log 模块
void write_log(int level, char* msg);
interface_c.cpp实现:
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x - y;
}
void write_log(int level, char* msg)
{
log(level, msg);
}
有了这几个文件,我们就可以在lua中调用C的函数了,接下来还差一步,就是需要生成调用C函数的cpp文件
tolua++ -n interface -o interface.cpp interface.pkg
生成interface.cpp,长长的内容我们可以不用管了,就是每个函数的检查参数,压栈出栈等操作。
写lua测试:
[zrs@local5 ~/lua/test2]$ cat test.lua
x = add(1, 2)
print(“add result = ” .. x)y = sub(20, 10)
print(“sub result = ” .. y)log.write_log(1, “test log”)
[zrs@local5 ~/lua/test2]$ ll
total 28
-rwxr-xr-x 1 zrs www 218 Feb 28 18:33 interface_c.cpp
-rwxr-xr-x 1 zrs www 99 Feb 28 18:26 interface_c.h
-rwxr-xr-x 1 zrs www 3167 Feb 28 18:25 interface.cpp
-rwxr-xr-x 1 zrs www 141 Feb 28 18:24 interface.pkg
-rwxr-xr-x 1 zrs www 319 Feb 28 18:30 main.cpp
-rwxr-xr-x 1 zrs www 1161 Feb 28 18:12 Makefile
-rw-r–r– 1 zrs www 118 Feb 28 18:33 test.lua
main.cpp
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#include "interface_c.h"
int tolua_interface_open (lua_State*);
int main (void)
{
lua_State* L = lua_open();
luaopen_base(L);
tolua_interface_open(L);
int ret = luaL_dofile(L,"test.lua");
lua_close(L);
return 0;
}
编译:
编译选项需要链接tolua++ -ltolua++5.1
测试:
[zrs@local5 ~/lua/test2]$ ./simpletest
add result = 3
sub result = 10
log level[1]:test log
测试通过。