2017-04-06 22 views
2

在我的項目中,我通過在lua的Makefile中添加lfs.c和lfs.h來構建帶有庫「lfs」(https://github.com/keplerproject/luafilesystem)的Lua5.1,它運行良好。如何用庫「lfs」構建lua 5.3?

但升級到lua5.3後,它不能是這樣的:

$ lua test.lua 
lua: test.lua:1: module 'lfs' not found: 
no field package.preload['lfs'] 
no file '/usr/local/share/lua/5.3/lfs.lua' 
no file '/usr/local/share/lua/5.3/lfs/init.lua' 
no file '/usr/local/lib/lua/5.3/lfs.lua' 
no file '/usr/local/lib/lua/5.3/lfs/init.lua' 
no file './lfs.lua' 
no file './lfs/init.lua' 
no file '/usr/local/lib/lua/5.3/lfs.so' 
no file '/usr/local/lib/lua/5.3/loadall.so' 
no file './lfs.so' 
stack traceback: 
    [C]: in function 'require' 
    test.lua:1: in main chunk 
    [C]: in ? 

test.lua:

local lfs = require"lfs" 
function attrdir (path) 
    for file in lfs.dir(path) do 
     if file ~= "." and file ~= ".." then 
      local f = path..'/'..file 
      print ("\t "..f) 
      local attr = lfs.attributes (f) 
      assert (type(attr) == "table") 
      if attr.mode == "directory" then 
       attrdir (f) 
      else 
       for name, value in pairs(attr) do 
        print (name, value) 
       end 
      end 
     end 
    end 
end 

attrdir(".") 

我已經檢查了最新的 「勞動力調查」 圖書館是Lua5.3支持的。

我的操作系統是MacOS的10.12,這裏是我使用

# Makefile for building Lua 
# See ../doc/readme.html for installation and customization instructions. 

# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= 

# Your platform. See PLATS for possible values. 
PLAT= none 

CC= gcc -std=gnu99 
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS) 
LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS) 
LIBS= -lm $(SYSLIBS) $(MYLIBS) 

AR= ar rcu 
RANLIB= ranlib 
RM= rm -f 

SYSCFLAGS= 
SYSLDFLAGS= 
SYSLIBS= 

MYCFLAGS= 
MYLDFLAGS= 
MYLIBS= 
MYOBJS= 

# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE ======= 

PLATS= aix bsd c89 freebsd generic linux macosx mingw posix solaris 

LUA_A= liblua.a 
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= lfs.o crc32.o lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o \ 
    lmathlib.o loslib.o lstrlib.o ltablib.o lutf8lib.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) 
ALL_A= $(LUA_A) 

# Targets start here. 
default: $(PLAT) 

all: $(ALL_T) 

o: $(ALL_O) 

a: $(ALL_A) 

$(LUA_A): $(BASE_O) 
    $(AR) [email protected] $(BASE_O) 
    $(RANLIB) [email protected] 

$(LUA_T): $(LUA_O) $(LUA_A) 
    $(CC) -o [email protected] $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) 

$(LUAC_T): $(LUAC_O) $(LUA_A) 
    $(CC) -o [email protected] $(LDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) 

clean: 
    $(RM) $(ALL_T) $(ALL_O) 

depend: 
    @$(CC) $(CFLAGS) -MM l*.c 

echo: 
    @echo "PLAT= $(PLAT)" 
    @echo "CC= $(CC)" 
    @echo "CFLAGS= $(CFLAGS)" 
    @echo "LDFLAGS= $(SYSLDFLAGS)" 
    @echo "LIBS= $(LIBS)" 
    @echo "AR= $(AR)" 
    @echo "RANLIB= $(RANLIB)" 
    @echo "RM= $(RM)" 

# Convenience targets for popular platforms 
ALL= all 

none: 
    @echo "Please do 'make PLATFORM' where PLATFORM is one of these:" 
    @echo " $(PLATS)" 

aix: 
    $(MAKE) $(ALL) CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-ldl" SYSLDFLAGS="-brtl -bexpall" 

bsd: 
    $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-Wl,-E" 

c89: 
    $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_C89" CC="gcc -std=c89" 
    @echo '' 
    @echo '*** C89 does not guarantee 64-bit integers for Lua.' 
    @echo '' 


freebsd: 
    $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -lreadline" 

generic: $(ALL) 

linux: 
    $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline" 

macosx: 
    $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_MACOSX" SYSLIBS="-lreadline" CC=cc 

mingw: 
    $(MAKE) "LUA_A=lua53.dll" "LUA_T=lua.exe" \ 
    "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \ 
    "SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe 
    $(MAKE) "LUAC_T=luac.exe" luac.exe 

posix: 
    $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX" 

solaris: 
    $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN -D_REENTRANT" SYSLIBS="-ldl" 

# list targets that do not create files (but not all makes understand .PHONY) 
.PHONY: all $(PLATS) default o a clean depend echo none 

# DO NOT DELETE 
lapi.o: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ 
lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \ 
ltable.h lundump.h lvm.h 
lauxlib.o: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h 
lbaselib.o: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h 
lbitlib.o: lbitlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h 
lcode.o: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ 
llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ 
ldo.h lgc.h lstring.h ltable.h lvm.h 
lcorolib.o: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h 
lctype.o: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h 
ldblib.o: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h 
ldebug.o: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ 
lobject.h ltm.h lzio.h lmem.h lcode.h llex.h lopcodes.h lparser.h \ 
ldebug.h ldo.h lfunc.h lstring.h lgc.h ltable.h lvm.h 
ldo.o: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ 
lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lopcodes.h \ 
lparser.h lstring.h ltable.h lundump.h lvm.h 
ldump.o: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \ 
ltm.h lzio.h lmem.h lundump.h 
lfunc.o: lfunc.c lprefix.h lua.h luaconf.h lfunc.h lobject.h llimits.h \ 
lgc.h lstate.h ltm.h lzio.h lmem.h 
lgc.o: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ 
llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h 
linit.o: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h 
liolib.o: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h 
llex.o: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldebug.h \ 
lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lgc.h llex.h lparser.h \ 
lstring.h ltable.h 
lmathlib.o: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h 
lmem.o: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ 
llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h 
loadlib.o: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h 
lobject.o: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \ 
ldebug.h lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h \ 
lvm.h 
lopcodes.o: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h 
loslib.o: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h 
lparser.o: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ 
llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ 
ldo.h lfunc.h lstring.h lgc.h ltable.h 
lstate.o: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ 
lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h llex.h \ 
lstring.h ltable.h 
lstring.o: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ 
lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h 
lstrlib.o: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h 
ltable.o: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ 
llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h 
ltablib.o: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h 
ltm.o: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ 
llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h ltable.h lvm.h 
lua.o: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h 
luac.o: luac.c lprefix.h lua.h luaconf.h lauxlib.h lobject.h llimits.h \ 
lstate.h ltm.h lzio.h lmem.h lundump.h ldebug.h lopcodes.h 
lundump.o: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ 
lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h \ 
lundump.h 
lutf8lib.o: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h 
lvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ 
llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h \ 
ltable.h lvm.h 
lzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \ 
lobject.h ltm.h lzio.h 
lfs.o: lfs.c lfs.h 
crc32.o: crc32.c crc32.h 

# (end of Makefile) 

任何意見makefile文件,將不勝感激

+1

您是否在linit.c中添加了lfs? – lhf

+0

@ lhf非常感謝,這是重點。但是我沒有在我的舊lua 5.1項目的Linit.c中看到這個代碼,這很奇怪...... – BlackOrange

回答

1

您需要添加lfslinit.c和重建。

2

這是我做了什麼和它工作得很好:

linit.c

添加LFS本節:

static const luaL_Reg loadedlibs[] = { 
    {"_G", luaopen_base}, 
    ... 
    {LUA_LFSLIBNAME, luaopen_lfs}, 

和lualib.h加入

#define LUA_LFSLIBNAME "lfs" 
LUAMOD_API int (luaopen_lfs) (lua_State *L); 

然後照常建造。希望這可以幫助。