C luajit在windows mingw64上编译lua lzma
所以我有一个需要lzma解压的项目,所以我在谷歌上找到了这个项目C luajit在windows mingw64上编译lua lzma,c,lua,luajit,C,Lua,Luajit,所以我有一个需要lzma解压的项目,所以我在谷歌上找到了这个项目 经过一番探索,我成功地编译了它,发现它是为Lua5.2编写的,所以我修改了一些行来修复它。在llzma.c文件中,我更改了luaL_newlib(L,L)行到luaL_寄存器(L,“lzma”,L),注释掉了luaL\u检查版本(L),并更改了大小\u t len=lua\u rawlen(L,1)至尺寸长度=lua\u objlen(L,1)等 我的makefile看起来像这样 all: lzma.dll lzma.dll:
经过一番探索,我成功地编译了它,发现它是为Lua5.2编写的,所以我修改了一些行来修复它。在llzma.c文件中,我更改了
luaL_newlib(L,L)代码>行到luaL_寄存器(L,“lzma”,L)代码>,注释掉了luaL\u检查版本(L)代码>,并更改了大小\u t len=lua\u rawlen(L,1)代码>至尺寸长度=lua\u objlen(L,1)代码>等
我的makefile看起来像这样
all: lzma.dll
lzma.dll: LzFind.o LzAlloc.o LzmaDec.o LzmaEnc.o LzmaLib.o llzma.o
gcc -O -shared -o lzma.dll llzma.o LzmaLib.o LzmaEnc.o LzmaDec.o
LzFind.o LzAlloc.o -L"..\bin" -llua51
LzFind.o: LzFind.c
gcc -O2 -c LzFind.c
LzAlloc.o: LzAlloc.c
gcc -O2 -c LzAlloc.c
LzmaDec.o: LzmaDec.c
gcc -O2 -c LzmaDec.c
LzmaEnc.o: LzmaEnc.c
gcc -O2 -c LzmaEnc.c
LzmaLib.o: LzmaLib.c
gcc -O2 -c LzmaLib.c
llzma.o: llzma.c
gcc -I..\luajit\src\src -O2 -c -o llzma.o llzma.c
我将其编译,但当我尝试通过require加载它时,我得到以下消息:
> require 'lzma'
error loading module 'lzma' from file '.\lzma.dll':
The specified procedure could not be found.
stack traceback:
[C]: at 0x66dd6c40
[C]: in function 'require'
stdin:1: in main chunk
[C]: at 0x00401f80
我又搜索了一下,发现了这个
然而,当我做dumpbin时,luaopen_lzma函数就在那里,所以它似乎已经被导出了。我在这里完全被难住了。我对二进制库之类的东西没有太多经验,所以这让我很烦恼。我希望能够编译和使用这个库,而不必编写自己的库。有人知道我做错了什么吗?我解决了我的问题,最初我编译并忘了链接llzma.c,所以它没有任何lua api代码,我把它放在二进制文件旁边的文件夹中,但它没有看到dll,也没有加载它,所以我把它放在工作目录中,它似乎工作正常。从那时起,我把它放在工作目录中,把旧的放在bin文件夹中,从那时起,它似乎在bin文件夹中找到了dll,并从该文件夹加载。因此,当我从bin文件夹中删除它时,它工作了…
这完全是我的失误和疏忽,很抱歉大家都来帮我解决问题,这表明我在这方面是多么的缺乏经验。你能上传你所做编辑的库吗?你尝试过lua-l线程的其他建议吗?将llzma.c
中的luaopen函数签名更改为LUALIB_API intluaopen_lzma(lua_State*L)
,看看是否有效。我确实尝试了LUALIB_API,就像我在另一个项目的源代码中看到的那样,但它也不起作用。这是我的两个更改过的文件,LuaJIT是用与您构建lzma模块相同的mingw编译器构建的吗?我相信是的。至少它是按原样分发的。作为旁注,我去编译了一个不同的项目,它运行得很好。此页中的base64库