linux下lua 加载C 动态库
上一篇 /
下一篇 2010-12-09 14:32:07
/ 个人分类:lua
按照网上所说,LUA加载C动态库搞了一把,终于在LINUX下搞通了,白白浪费许多时间。
总结几条:
1.动态库要供LUA调用的function,其定义要符合:
typedef int function(lua_State *L)
这个一般大家都知道
2.在动态库调用LUA注册:
将要调用的
函数放到这个结构体里:
struct luaL_Reg lib[] =
{}
在动态库的入口函数里调用luaL_register将这个结构体注册3.入口
函数定义很重要,一定是要定义成:
int luaopen_XXX(lua_State *L)否则就提示找不到动态库,
汗
在这个入口函数注册结构体时,要注册成:
luaL_register(L,"XXX",lib);与入口函数的luaopen_XXX的XXX要一致。
4.在写脚本的时候,使用require("XXX"),就是入口函数的luaopen_后面的XXX,注意大小写敏感
5.编译生成的动态库命令成XXX.so,对,同入口
函数的luaopen_后面的XXX一致
SAMPLE:
C文件如下:
#include <stdio.h>
#include "./src/lua.h"
#include "./src/lualib.h"
#include "./src/lauxlib.h"
static int add(lua_State *L)
{
int a,b,c;
a = lua_tonumber(L,1);
b = lua_tonumber(L,2);
c = a+b;
lua_pushnumber(L,c);
printf("test hello!!!\r\n");
return 1;
}
static const struct luaL_Reg lib[] =
{
{"testadd",add},
{NULL,NULL}
};
int luaopen_testlib(lua_State *L)
{
luaL_register(L,"testlib",lib);
return 1;
}
编译: gcc test.c -fPIC -shared -o testlib.so
脚本编写:
require("testlib")
c = testlib.testadd(15,25)
print("The result is ",c);
收藏
举报
TAG: