Lua C module 注意事项

lua脚本中的C module必须采用动态链接库的形式.
如果lua脚本再被c程序调用,c程序和CModule都必须动态链接lua库,(如果采用静态链接的方式,会报multiple Lua VMs detected错误,认为启动了两个lua虚拟机)。
这样,就需要把lua编译成动态链接库,而lua默认提供的makefile没有编译动态链接库,不知道为啥,具体修改(红色部分)如下:


1. Makefile

TO_LIB= liblua.a liblua.so


2. src/Makefile

LUA_A=  liblua.a
LUA_SO= liblua.so
CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o \
    lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o \
    ltm.o lundump.o lvm.o lzio.o
LIB_O=  lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o \
    lmathlib.o loslib.o lstrlib.o ltablib.o loadlib.o linit.o
BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS)


LUA_T=  lua 
LUA_O=  lua.o


LUAC_T= luac
LUAC_O= luac.o


ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O)
ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)
ALL_A= $(LUA_A)


# Targets start here.
default: $(PLAT)


all:    $(ALL_T)


o:  $(ALL_O)


a:  $(ALL_A)


$(LUA_A): $(BASE_O)
    $(AR) $@ $(BASE_O)
    $(RANLIB) $@


$(LUA_SO):$(CORE_O) $(LIB_O)

    $(CC) -o $@ -shared $? -ldl -lm




编译第三方C Module
gcc -o LuaXML_lib.so -fPIC -shared LuaXML_lib.c -llua -ldl 


编译C可执行程序
gcc 1.c 0o 1 -llua -ldl -lm

你可能感兴趣的:(LUA,multiple,Lua,VMs,detected)