我下载了LuaJIT的源代码并使用msvc120.dll(VS 2013 x64)进行了编译。当我从命令行运行它时,执行一些基本的lua没有问题。现在,LuaJIT安装指南提到将luajit.exe和lua51.dll移动到他们自己的文件夹中。从那里开始创建一个lua文件夹,然后在新创建的jit文件夹下面移动一个带有src / jit内容的jit文件夹。
根据我的理解,我的文件夹应该如下并包含:
luajit.exe lua51.dll /lua /jit bc.lua [rest of jit files] vmdef.lua
这是正确的还是我丢失了文件?
现在,在我建立了我的luajit之后,我试图将它连接到我的luarocks中,作为我的翻译使用
install.bat /LUA C:\LuaJIT\2.0.3\[folder with above content]
然而,这找不到头文件。然后我将头文件中的头文件复制到上面的文件夹中并将其连接起来,但是当我指向LuaJIT时,我实际上无法获得任何编译。 修改:我得到的错误如下,
C:\LuaJIT\2.0.3\bin\lua51.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x2D0 Error: Failed installing dependency: https://rocks.moonscript.org/luafilesystem-1.6.2-2.src.rock - Build error: Failed compiling module lfs.dll
处理这个问题的正确方法是简单地指向我的lua二进制文件,并从那里利用LuaJIT来运行我的文件,或者我是否在连接LuaJIT和luarocks时做错了什么?前者似乎在很大程度上起作用,因为我只碰到了一个库编译问题,lua-cjson。
答案 0 :(得分:1)
我遇到了完全相同的问题,但他们在这里找到了解决方案:
https://github.com/keplerproject/luafilesystem/issues/22
我知道对于“静态链接DLL”,有一个所谓的“export”.lib文件,它被传递给链接器(而不是DLL本身)。
因此,例如,在编译时,LuaRocks正在这样做:
cl /nologo /MD /O2 -c -Fosrc/mime.obj -ID:/LuaJIT-2.0.4/include/ src/mime.c -DLUA_COMPAT_APIINTCASTS -DLUASOCKET_DEBUG -DNDEBUG -DLUASOCKET_API=__declspec(dllexport) -DMIME_API=__declspec(dllexport) mime.c
link -dll -def:core.def -out:mime/core.dll D:/LuaJIT-2.0.4/bin/lua51.dll src/mime.obj
我的LuaJIT是从D:\LuaJIT-2.0.4\src
的源代码编译的,但我自己创建了两个文件夹:D:\LuaJIT-2.0.4\include
,其中*.h
个文件已从src
和D:\LuaJIT-2.0.4\bin
复制而来luajit.exe
,lua51.dll
,然后是lua51.exp
和lua51.lib
。仍然是同样的错误,但这是正确的轨道。
现在,检查LuaRocks配置的位置:
luarocks.bat help
向下滚动到以下部分:
CONFIGURATION
Lua version: 5.1
Configuration files:
System: D:/luarocks/config-5.1.lua (ok)
User : (... snip ...)
编辑系统配置文件,具体参见部分:
variables = {
MSVCRT = 'VCRUNTIME140',
LUALIB = 'lua51.dll'
}
下面! LUALIB
应该是.lib
文件。如果您的导出库与DLL一起,则只需更改为:
variables = {
MSVCRT = 'VCRUNTIME140',
LUALIB = 'lua51.lib' -- here!
}
现在:
luarocks.bat install luasocket
(...)
link -dll -def:core.def -out:socket/core.dll D:/LuaJIT-2.0.4/bin/lua51.lib src/luasocket.obj (...)
(...)
luasocket 3.0rc1-2 is now built and installed in D:\luarocks\systree (license: MIT)
注意传递给链接器的第一个参数。