Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use LuaJIT's ffi module when embedding?

Tags:

c

lua

ffi

luajit

I'm trying to embed LuaJIT into a C application. The code is like this:

#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;
}

the Lua code is like this:

-- Test FFI
local ffi = require("ffi")
ffi.cdef[[
int barfunc(int foo);
]]
local barreturn = ffi.C.barfunc(253)
io.write(barreturn)
io.write('\n')

It reports error like this:

Failed to run script: hello.lua:6: cannot resolve symbol 'barfunc'.

I've searched around and found that there're really little document on the ffi module. Thanks a lot.

like image 596
jagttt Avatar asked May 07 '11 07:05

jagttt


1 Answers

ffi library requires luajit, so you must run lua code with luajit. From the doc: "The FFI library is tightly integrated into LuaJIT (it's not available as a separate module)".

How to embed luajit? Look here http://luajit.org/install.html under "Embedding LuaJIT"

Under mingw your example run if i add

__declspec(dllexport) int barfunc(int foo)

at the barfunc function.

Under Windows luajit is linked as a dll.

like image 71
misianne Avatar answered Oct 13 '22 04:10

misianne