Embacadero C ++ Builder XE5的LuaJIT错误

时间:2017-02-14 13:14:03

标签: c++ lua c++builder luajit c++builder-xe5

我使用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都能正常工作。

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

0 个答案:

没有答案