将Lua共享对象编译成嵌入式C。

我有这段代码 (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 中,然后我可以从 test.lua 中调用 zstring 并使用它。

如何做到呢?

点赞
用户142162
用户142162

你可以通过包含 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 创建一个对象文件(例如使用 gcc-c 标志)。然后你可以将该对象文件与你的主源代码进行链接。

具体操作步骤如下:

  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

2014-04-30 10:57:26