我使用MinGW32和MSVC32编译了最新的 LuaJIT 版本, 然后使用Embarcadero的implib工具创建一个导入库:
implib -a lua51.lib lua51.dll
该库与示例C ++程序链接,并使用bcc32编译器进行编译。
与香草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都能正常工作。
有没有人知道发生了什么?