我使用 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 都可以正常工作。
有谁知道发生了什么?