LuaJIT FFI加载dll报错

LuaJIT FFI load dll error

我想在 C 中编写一些函数以在 Lua 中使用,我认为我能找到的最简单的方法是使用 LuaJIT 的 FFI。

我有一个 C 文件 "add.c":

int add(int a, int b){
return a+b;
}

我 assemble 把它变成 "add.o" 用:

gcc -c add.c

我做 "add.dll":

gcc - shared -o add.dll add.o

最后,我尝试 运行 以下 Lua 代码 LuaJIT:

local ffi =require("ffi")

local test=ffi.load("C:\users\quebe\Desktop\add")

ffi.cdef[[
int add(int a,int b);
]]

print(test.add(1,2))

并得到:

luajit: test.lua:3: cannot load module 'C:\users\quebe\Desktop\add': %1 is 
not a valid Win32 application.

stack traceback:
    [C]: in function 'load'
    test.lua:3: in main chunk
    [C]: at 0x7ff72be120c0

但我不知道如何将其解释为调试。

根据this,在加载dll之前应该有C函数的声明:

local ffi =require("ffi")
ffi.cdef[[
   int add(int a, int b)
]]
local test=ffi.load("C:\users\quebe\Desktop\add")

附录:

此外,正如 Egor Skriptunoff 提到的,dll 文件中的函数应该声明为导出的。 this SO answer中给出了具体细节。

这听起来像是您要加载的 dll 具有无法加载的依赖 dll - 通常是因为它们不在 Windows 搜索路径中。

解决思路:

  • 获取 dependency walker 并查看您的 dll - 缺少的通常标记为红色。
  • 通常,如果您使用 Visual Studio 构建,您可能需要 visual studio 运行时,例如 vcp140.dll 和 vcr140.dll(或类似)。这些有时没有正确注册,您可能需要这样做。
  • 在 Windows 上,您必须确保在构建 dll 时导出所有函数(这可以通过多种方式完成 - 请参阅 MSVC 帮助)并且它们具有 __stdcall或 __cdecl 名称修改。没有这个,你将无法使用 ffi 调用函数。
  • 最后,注意 dll 的安全禁用。有时dll会被Win10系统标记为不可用。检查属性并启用 dll。在某些类型的文件夹之间复制 dll 时通常会发生这种情况。

我在尝试做一些相关的事情时遇到了同样的错误,原来 LuaJIT 二进制文件是用 64 位编译的,而我试图加载的 .dll 是用 32 位编译的。