所以我有一个项目,我需要lzma解压缩所以我用Google搜索并找到了这个项目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 但是,当我执行dumpbin时,luaopen_lzma函数就在那里,所以它似乎已经导出了。我在这里彻底难倒。我对二进制库等没有太多经验,所以这让我很烦恼。我希望能够编译和使用这个库,而不必编写自己的库。有谁知道我做错了什么?
答案 0 :(得分:0)
我解决了我的问题,最初我编译并忘记链接llzma.c所以它没有任何lua api代码,我把它放在它的文件夹中的二进制文件旁边但它没有&#39 ;看到dll并没有加载它,所以我把它放在工作目录中,它似乎工作。从那时起,我把它放在工作目录中,并将旧的文件夹保留在bin文件夹中,从那时起,它似乎在bin文件夹中找到了dll并从该文件夹加载。所以当我从bin文件夹中删除它时它起作用了......
所以这对我来说是完全失败和疏忽,对不起大家过去常常帮我解决问题的时候,这只是表明我对这些东西的经验是多么缺乏。