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文件
该pkg定义了add、sub和log模块的write_log接口。
interface_c.cpp实现:
有了这几个文件,我们就可以在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
编译:
编译选项需要链接tolua++ -ltolua++5.1
测试:
[zrs@local5 ~/lua/test2]$ ./simpletest
add result = 3
sub result = 10
log level[1]:test log
测试通过。
使用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
测试通过。
相关文章推荐
- cocos2dx中使用tolua++使lua调用c++函数
- Cocos2d-Lua 3.12 生成绑定 导出C++类给LUA调用( tolua genbindings.py 的使用)
- cocos2dx中注册导出c++函数供lua调用(使用tolua++)
- Cocos2d-Lua 3.12 生成绑定 导出C++类给LUA调用( tolua genbindings.py 的使用)
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- Quick-Cocos2d-x 2.26 使用tolua工具导出C++的类给Lua调用WINDOWS篇
- 使用tolua++实现C++与LUA相互调用
- 使用tolua++实现C++与LUA相互调用
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- 使用tolua++实现C++与LUA相互调用
- 使用tolua++实现C++与LUA相互调用
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- tolua 使用 Lua调用c++多返回值函数
- 使用tolua++编译pkg,从而创建自定义类让Lua脚本使用
- Lua调用C函数
- Tolua使用笔记五:lua中遍历访问c#的Dictionary类对象与枚举类型
- Lua学习笔记二--在Lua中使用自己的C函数