0

我使用 MinGW32 和 MSVC32 编译了最新的LuaJIT版本,然后使用 Embarcadero 的 implib 工具创建了一个导入库:

implib -a lua51.lib lua51.dll

该库与示例 C++ 程序链接,并使用 bcc32 编译器进行编译。

与 vanilla Lua 5.1 一起工作的所有东西都可以在 LuaJIT 上正常工作(当然要快得多),但问题出现在FFI上。

这是我的 C++ 代码中的一个简单 C 函数:

// header
extern "C"  {
  int test_ffi(int value);
  }
// cpp file
int test_ffi(int value) {
   int xx = value + 1;
   return xx;
}

test.lua 文件:

local ffi = require("ffi")
ffi.cdef[[int test_ffi(int value);]]
local a = 100
local C = ffi.C
local result = C.test_ffi(a) 

CPP执行部分:

//...
lua_State *L =  luaL_newstate();
luaL_openlibs(L);
lua_pushlightuserdata(L, (void*)test_ffi);
luaJIT_setmode(L, -1, LUAJIT_MODE_WRAPCFUNC|LUAJIT_MODE_ON);
lua_pop(L, 1);
int result;
result = luaL_loadfile(L, "test.lua");
if (result == 0)
   result = lua_pcall(L, 0, 0, 0);
lua_close(L);
//...

lua_pcall()执行时,它test_ffi()按预期调用,但是传递给函数的值不是100,而是一些未初始化的随机值。结果lua_pcall()是 2。

我尝试了各种调用约定(__cdecl, __stdcall)但没有效果。

此外,用 MinGW32 DLL 替换 MSVC32 DLL 会产生相同的结果。

void调用某个函数时,lua_pcall()会在lua51.dll. 我知道 LuaJIT 并没有正式支持 bcc32 编译器,但是除了 FFI,其他所有的 API 都可以正常工作。

有谁知道发生了什么?

4

0 回答 0