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

标签 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中,然后我可以从test.lua调用zstring并使用它

怎么做?

最佳答案

您可以通过包含 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. 在主源文件中包含 header :

    #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)

关于将lua共享对象编译为嵌入式c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23378891/

相关文章:

c - C 的静态代码分析器

mysql - 在 Ubuntu 上安装 luaSQL

javascript - 如何从 Javascript 调用 Lua 函数

linux - Linux中应用程序的自动启动

c - STM32F103 GPIO 端口

c - 在 STM32L1 上删除我的闪存

我可以使用标记粘贴来处理编译时命名吗?

c - 使用fscanf和fprintf实现复制功能

c# - 跟踪套接字(文件)描述符回到绑定(bind)地址

lua - 如何提取非固定字符串的数据