Как использовать модуль FFI LuaJIT при встраивании?
Я пытаюсь встроить LuaJIT в приложение C. Код выглядит так:
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <stdlib.h>
#include <stdio.h>
int barfunc(int foo)
{
/* a dummy function to test with FFI */
return foo + 1;
}
int
main(void)
{
int status, result;
lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
/* Load the file containing the script we are going to run */
status = luaL_loadfile(L, "hello.lua");
if (status) {
fprintf(stderr, "Couldn't load file: %sn", lua_tostring(L, -1));
exit(1);
}
/* Ask Lua to run our little script */
result = lua_pcall(L, 0, LUA_MULTRET, 0);
if (result) {
fprintf(stderr, "Failed to run script: %sn", lua_tostring(L, -1));
exit(1);
}
lua_close(L); /* Cya, Lua */
return 0;
}
код Lua выглядит так:
-- Test FFI
local ffi = require("ffi")
ffi.cdef[[
int barfunc(int foo);
]]
local barreturn = ffi.C.barfunc(253)
io.write(barreturn)
io.write('n')
он сообщает об ошибке, как это:
Failed to run script: hello.lua:6: cannot resolve symbol 'barfunc'.
Я искал вокруг и обнаружил, что в модуле ffi действительно мало документов. Большое спасибо.
3 ответов
библиотека ffi требует luajit, поэтому вы должны запустить lua-код с luajit. Из док: "Библиотека FFI тесно интегрирована в LuaJIT (она недоступна как отдельный модуль)".
Как вставить luajit? Смотри сюдаhttp://luajit.org/install.html в разделе "вложение LuaJIT"
в mingw ваш пример запускается, если я добавлю
__declspec(dllexport) int barfunc(int foo)
в функции barfunc.
под Windows luajit связан как dll.
как указала мизиан, вам нужно экспортировать функцию, которую вы можете сделать с помощью extern Если вы используете GCC:
extern "C" int barfunc(int foo)
{
/* a dummy function to test with FFI */
return foo + 1;
}
Если у вас возникли проблемы с неопределенными символами в Linux с помощью GCC, позаботьтесь о том, чтобы компоновщик добавил все символы в таблицу динамических символов, передав -rdynamic флаг GCC:
G++ -O приложение soure.cpp -rdynamic -И... -Л... -llua
для тех из вас, кто пытается сделать эту работу в Windows с VC++ (2012 или более поздней версии), используя компилятор C++:
- убедитесь, что вы используете .расширение cpp, как это будет делать компиляция c++
- сделайте функцию иметь внешний рычаг C так, что ffi сможет соединить к нему, с
extern "C" { ... }
- экспорт функции из исполняемого файла с помощью
__declspec(dllexport)
- дополнительно укажите соглашение о вызове
__cdecl
, не требуется, потому что должно быть по умолчанию и не портативный -
оберните заголовки Lua в
extern "C" { include headers }
, или лучше просто#include "lua.hpp"
#include "lua.hpp" extern "C" { __declspec(dllexport) int __cdecl barfunc(int foo) { return foo + 1; }}