LuaJIT 在 Embarcadero C++Builder XE5 中出现的错误

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

implib -a lua51.lib lua51.dll

这个库被链接到一个样例 C++ 程序并且使用 bcc32 编译器编译。

所有和正常 Lua 5.1 的操作都可以在 LuaJIT 上运行(当然比Lua 5.1 快很多),但是问题在于 FFI

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

// 头文件
extern "C"  {
  int test_ffi(int value);
  }
// cpp 文件
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),但是没有效果。

同时,将 MSVC32 DLLs 替换为MinGW32 DLLs 也产生了相同的结果。

当调用某个 void 函数时,lua_pcall() 会在 lua51.dll 中产生访问冲突。我知道 LuaJIT 并不官方支持 bcc32 编译器,但除了 FFI 之外,所有其他的 API 都能正确工作。

有没有人知道发生了什么?

点赞