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吧。。😂)
posted @ 2021-09-29 09:14  seas  阅读(191)  评论(0编辑  收藏  举报