lua 好归好,但有很多对效率要求较高的服务,还得让C来完成。本篇学习下Lua如何调用C。
最重要的部分:
定义一个 luaopen_* 函数,并调用 luaL_openlib 函数
int luaopen_mylib(lua_State *L)
{
luaL_Reg l[] = {
{"test1",test1}, // key-val,相当于{"(lua调用时使用的函数名)",C定义函数名(函数指针)}
{"test2",test2},
{NULL,NULL} // 必不可少
};
luaL_newlib(L,l);
return 1;
}
这个函数相当于作为此动态库的main函数。需要注意:
1、luaopen_是此函数的前缀,不可修改。后面的内容是我们在lua中使用 require 引用此库时的字符串名称(假如名称中带有下划线,在使用require需要将下划线替换为点,例如:“mylib_test”->“mylib.test”)。
2、在Lua5.0中调用的是luaL_openlib,但是在Lua5.3中,则是使用luaL_newlib
下面是一个简单的例子:
#include <lua.h> //Lua基础函数库,lua_前缀
#include <lauxlib.h> //辅助库,luaL_前缀,利用lua.h实现的更高层的抽象
#include <stdio.h>
/**
* 定义在lua中可调用的函数,要遵循规范:返回值必须为int,需传入lua_State
*/
static int test(lua_State *L)
{
size_t len = 0;
int num = luaL_checkinteger(L, 1);
const char* str = luaL_checklstring(L, 2, &len);
printf("come from test: num = %d str = %s len = %d\n", num, str, len);
return 0;
}
int luaopen_myLib(lua_State *L)
{
luaL_Reg l[] =
{
{"test", test},
{NULL, NULL}
};
luaL_newlib(L, l);
return 1;
}
luaL_checkinteger() 和 luaL_checklstring()是用来获取参数的。
如何生成 .so 动态库?
gcc -fPIC -shared -o myLib.so myLib.c
接着用lua调用:
--设置.so搜寻路劲
package.cpath = "./?.so"
--加载我们自定义的库mylib.so
local myLib = require "myLib"
myLib.test(666, "mick")
输出如下:
come from test: num = 666 str = mick len = 4