Lua调用C
工作记录2
工作中用到openresty,一些需求需要Lua对接C代码,这次使用直接调用so库的方式,比我预想的稍微麻烦,因为不能直接的对接,需要用一些C里面的lua库,所以记录一下,以下是实验时的代码不涉及业务
编写C文件
// C文件
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
/* 所有注册给Lua的C函数具有
* * "typedef int (*lua_CFunction) (lua_State *L);"的原型。
* */
static int l_sin(lua_State *L)
{
size_t len = 0;
const char * msg = luaL_checklstring(L, 1, &len);
setenv("TZ", msg, 1);
printf("test-TZ = %s\n", getenv("TZ"));
return 1; /* number of results */
}
static const struct luaL_Reg mylib[] = {
{"mysin", l_sin},
{NULL, NULL}
};
extern int luaopen_mylib(lua_State* L)
{
luaL_register(L, "mylib", mylib);
return 1;
}
可以看到,使用luaopen_mylib函数将c的接口暴漏给lua,luaL_register创建一个路由,路由详细内容使用luaL_Reg结构体定义;L为传参
编译为so文件
使用
gcc mylib.c -fPIC -shared -o mylib.so -Wall -I /tmp/lua-5.1.5/src/
编译为so库,-I是lua对C的环境支持,如果可以找到就不用指定,我测试时候死活找不到lua.h等文件,就直接下了个源码指定了
这里网上大部分是用的makefile,我测试时候是没有成功,而且还没有什么报错提示信息,所以就放弃了
使用lua调用so库
# lua文件
local mylib = require "mylib"
mylib.mysin("+8:00")
可以看到,第一行找到mylib的库,第二行调用,这里我是放到同文件夹下,如果不同文件夹导入可能要用其它办法(主要我忘了,自行google吧。。😂)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
有任何问题请随时交流~
Email: araise1@163.com