【问题标题】:LuaJIT FFI load dll errorLuaJIT FFI 加载 dll 错误
【发布时间】:2018-01-21 04:57:00
【问题描述】:

我想用 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

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

【问题讨论】:

  • 也许尝试“add.dll”而不是“add”?
  • 文档说luajit.org/ext_ffi_api.html它会寻找.dll,但我什至尝试过.so(虽然我在Windows上)也无济于事。
  • 我对 C 语言比较陌生,尤其是动态库,我是否认为我错过了程序集中的某些内容或 C 脚本中的某些内容。
  • 您使用的是什么平台? Windows、Linux 还是其他?
  • @CircArgs - 您是否从库中导出函数 add

标签: c lua ffi luajit


【解决方案1】:

根据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 一定有问题?
  • 我只在 linux 上使用过 luajit,我的专业知识到此结束。我会针对问题本身提出一些关于 cmets 中 dll 的建议。
【解决方案2】:

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

解决思路:

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

【讨论】:

    【解决方案3】:

    我在尝试执行相关操作时遇到了同样的错误,结果发现 LuaJIT 二进制文件是用 64 位编译的,而我尝试加载的 .dll 是用 32 位编译的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-03
      • 2023-03-27
      • 2011-08-07
      • 2012-09-01
      • 2019-11-06
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多