Как использовать ffi модуль LuaJIT при встраивании? - PullRequest
11 голосов
/ 07 мая 2011

Я пытаюсь встроить 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: %s\n", 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: %s\n", 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 ]

9 голосов
/ 07 мая 2011

Библиотека ffi требует luajit, поэтому вы должны запускать код lua с помощью luajit.Из документа: «Библиотека FFI тесно интегрирована в LuaJIT (она не доступна как отдельный модуль)».

Как встроить luajit?Посмотрите здесь http://luajit.org/install.html в разделе "Встраивание LuaJIT"

В вашем примере mingw запустите, если я добавлю

__declspec(dllexport) int barfunc(int foo)

в функцию barfunc.

Под Windows luajitсвязан как DLL.

3 голосов
/ 22 апреля 2012

Как указал Мисианн, вам нужно экспортировать функцию, которую вы можете сделать, используя 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 -родинамический -I ... -L ... -llua

2 голосов
/ 15 ноября 2013

Для тех из вас, кто пытается заставить это работать в 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;
    }}
    
...