首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LuaJIT FFI加载dll错误

LuaJIT FFI加载dll错误
EN

Stack Overflow用户
提问于 2017-08-13 00:40:38
回答 3查看 2.1K关注 0票数 4

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

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

代码语言:javascript
复制
int add(int a, int b){
return a+b;
}

我将其组装成"add.o“,并:

代码语言:javascript
复制
gcc -c add.c

我制作"add.dll":

代码语言:javascript
复制
gcc - shared -o add.dll add.o

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

代码语言:javascript
复制
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))

并得到:

代码语言:javascript
复制
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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-13 11:21:49

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

代码语言:javascript
复制
local ffi =require("ffi")
ffi.cdef[[
   int add(int a, int b)
]]
local test=ffi.load("C:\\users\\quebe\\Desktop\\add")

增编:

此外,正如Egor Skriptunoff所述,应该将dll文件中的函数声明为导出函数。细节是在中给出的,所以请回答。

票数 2
EN

Stack Overflow用户

发布于 2020-09-07 06:01:13

这听起来像你试图加载的dll有依赖的dll不能加载-通常是因为它们不在Windows搜索路径中。

解决办法:

  • 抓取依赖程序并查看您的dll --缺失的dll通常标记为红色。
  • 通常,如果使用Visual构建,您可能需要像vcp140.dll和vcr140.dll (或类似的)这样的visual Studio运行时。这些文件有时没有正确注册,您可能需要这样做。
  • 在Windows上,您必须确保在构建dll时,所有函数都会导出(这可以通过几种方式完成--参见MSVC帮助),并且它们具有__stdcall或__cdecl名称损坏。没有这一点,就无法使用ffi调用函数。
  • 最后,要注意dll的安全禁用。有时,Win10系统将标记dlls为不可用。检查属性并启用dll。在某些类型的文件夹之间复制dll时通常会发生这种情况。
票数 0
EN

Stack Overflow用户

发布于 2021-09-20 16:14:18

我在尝试做一些相关的事情时也犯了同样的错误,结果是LuaJIT二进制是用64位编译的,而我试图加载的.dll是用32位编译的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45656120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档