将lua共享对象编译成嵌入式c

时间:2014-04-30 02:57:16

标签: c lua embedded

我有这段代码(zstring.c

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#include <string.h>

static int zst_strlen(lua_State *L)
{
    size_t len;
    len = strlen(lua_tostring(L, 1));
    lua_pushnumber(L, len);
    return 1;
}

int luaopen_zstring(lua_State *L) 
{
    lua_register(L,"zst_strlen", zst_strlen);
    return 0;
}

这是我的lua嵌入式

int main (){
    L = luaL_newstate();
    luaL_openlibs(L);
    luaL_dofile(L, "test.lua");
    lua_close(L);
    return 0;
}

我不希望将zstring.c编译为zstring.so对象

我希望zstring.c汇编到我的嵌入式lua,然后我可以从zstring拨打test.lua并使用它

怎么做?

1 个答案:

答案 0 :(得分:1)

您可以通过包含zstring源文件然后在初始化Lua后调用luaopen_zstring来完成此操作:

#include "zstring.c"

int main (){
    L = luaL_newstate();
    luaL_openlibs(L);
    lua_pushcfunction(L, luaopen_zstring);
    lua_call(L, 0, 0);
    luaL_dofile(L, "test.lua");
    lua_close(L);
    return 0;
}

应该注意的是,即使您不想生成共享库,您仍然可以为zstring创建一个目标文件(使用-c标记gcc,例如)。然后,您可以将该对象文件与主要源链接。

执行此操作的步骤大致如下:

  1. zstring.c编译为目标文件(例如gcc -c -o zstring.o zstring.c
  2. 创建名为zstring.h的标头文件:

    #ifndef ZSTRING_H
    #define ZSTRING_H
    int luaopen_zstring(lua_State *L);
    #endif
    
  3. 在主要源文件中包含标题:

    #include "zstring.h"
    
    int main (){
        L = luaL_newstate();
        luaL_openlibs(L);
        lua_pushcfunction(L, luaopen_zstring);
        lua_call(L, 0, 0);
        luaL_dofile(L, "test.lua");
        lua_close(L);
        return 0;
    }
    
  4. 使用链接的zstring.o目标文件编译主文件(例如gcc -o myprogram main.c zstring.o