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:

水手辛巴的个人空间 引用 删除 水手辛巴   /   2011-03-14 15:22:48
难道是易老大的博客?
 

评分:0

我来说两句

Open Toolbar