您的位置:首页 > 编程语言 > Lua

Lua调用C函数:tolua++ 的使用

2012-08-09 14:45 691 查看
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);
}


该pkg定义了add、sub和log模块的write_log接口。

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

测试通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: