Я собрал последнюю LuaJIT версия с использованием как MinGW32, так и MSVC32,
и затем создал импортную библиотеку, используя инструмент implib Embarcadero:
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
) но без эффекта.
Кроме того, замена библиотек MSVC32 на библиотеки DLL MinGW32 приводит к тому же результату.
Когда некоторые void
функция называется, lua_pcall()
производит нарушение прав доступа в lua51.dll
, Я знаю, что LuaJIT официально не поддерживает компиляторы bcc32, но, за исключением FFI, все остальные API работают правильно.
Кто-нибудь знает, что происходит?
Задача ещё не решена.
Других решений пока нет …