我有此代码(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并使用它

怎么做?

最佳答案

可以通过包括zstring源文件则调用luaopen_zstring初始化的Lua后实现此目的:

#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一起使用)。然后,您可以将该对象文件与您的主要源链接。

大致的步骤如下:


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

#ifndef ZSTRING_H
#define ZSTRING_H
int luaopen_zstring(lua_State *L);
#endif

在您的主要源文件中包含标题:

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

使用链接的zstring.o目标文件编译主文件(例如gcc -o myprogram main.c zstring.o

08-27 20:36