阅读服务端框架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()