【发布时间】:2017-11-07 10:41:01
【问题描述】:
所以我有一个需要 lzma 解压的项目,所以我用谷歌搜索并找到了这个项目https://github.com/rainfiel/lua-lzma
经过一番摸索,我设法编译它,发现它是为 lua 5.2 编写的,所以我更改了一些行来解决这个问题。在 llzma.c 文件中,我将luaL_newlib(L, l); 行更改为luaL_register(L, "lzma", l);,注释掉luaL_checkversion(L);,并将size_t len = lua_rawlen(L, 1); 更改为size_t len = lua_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
我做了更多搜索,发现了这个http://lua-users.org/lists/lua-l/2013-03/msg00363.html
然而,当我做垃圾箱时,luaopen_lzma 函数就在那里,所以它似乎已经被导出了。我在这里完全被难住了。我对二进制库等没有太多经验,所以这让我很困扰。我希望能够编译和使用这个库,而不必自己编写。有谁知道我做错了什么?
【问题讨论】:
-
你能上传你所做的编辑的图书馆吗?
-
你在那个 lua-l 线程上尝试过其他建议吗?将
llzma.c中的luaopen函数签名改成LUALIB_API int luaopen_lzma(lua_State* L)看看是否可行。 -
我确实尝试了 LUALIB_API,因为我在另一个项目的源代码中看到了它,但它也不起作用。这是我的两个更改文件pastebin.com/ZKZCqqJd 和pastebin.com/NiRJAprY
-
LuaJIT 是否使用与构建 lzma 模块相同的 mingw 编译器构建?
-
我相信是的。至少它是按原样分发的。作为旁注,我去编译了一个不同的项目,它工作得很好。 webserver2.tecgraf.puc-rio.br/~lhf/ftp/lua 此页面中的 base64 库