LuaJIT FFI加载DLL错误

时间:2017-08-13 00:40:38

标签: c lua ffi luajit

我想用C语言编写一些函数在Lua中使用,最简单的方法就是使用LuaJIT的FFI。

我有一个C文件“add.c”:

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

我将它组装成“add.o”:

gcc -c add.c

我制作“add.dll”:

gcc - shared -o add.dll add.o

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

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

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

2 个答案:

答案 0 :(得分:2)

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

ftp:

附录:

此外,正如Egor Skriptunoff所提到的,dll文件中的函数应声明为export。详情见this SO答案。

答案 1 :(得分:0)

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

解决思路:

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