lua使用自定义动态库

2017-01-13  本文已影响257人  一个过客

阅读服务端框架skynet. 里面涉及了c封装的so供给lua层调用本文主要讲述如何封装一个so。并供给lua层调用。

编写so源文件

mylib.c

#include <lua.h>
#include <luaxlib.h>
#include <stdio.h>

static int log(lua_State *L){
    int num = luaL_checkinteger(L, 1);
    printf("log num :%d", num);
    return 0;
}

static int logEx(lua_State *L){
  size_t len = 0;
  const char* str = lua_checkstring(L, 1, &len);
  print("logEx %s %d", str, len);
  return 0
}

int luaopen_mylib(lua_State *L){
  luaL_Reg = libs[] = {
    {"log", log},
    {"logEx", log},
    {nullptr, nullptr}
  }
  luaL_newlib(L, 1);
  return 1;
}

编写makefile

makefile

CC ?= gcc  
CFLAGS = -g -O2 -Wall -I$(LUA_INC)  
SHARED := -fPIC --shared  
TARGET = myLualib.so  
LUA_CLIB_PATH = clib  
# 引入lua头文件  
LUA_INC ?= /root/lua-5.3.0/src  
start: $(TARGET)  
$(TARGET) : mylib.c | $(LUA_CLIB_PATH)  
    $(CC) $(CFLAGS) $(SHARED) $^ -o $@  
clean:  
    rm -fr $(TARGET)  
$(LUA_CLIB_PATH) :  
    mkdir $(LUA_CLIB_PATH)  

生成so

make start
生成so文件myLualib.so。

lua使用so

function testLib( ... )  
    package.cpath = "./?.so" --搜寻路劲  
    local f = require "myLualib" -- 对应luaopen_myLualib中的myLualib  
    f.lig(123)  
    f.logEx("hello world")  
end  
testLib()
上一篇 下一篇

猜你喜欢

热点阅读