我有这个代码(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
)。然后您可以将该目标文件与您的主要源链接。
执行此操作的步骤大致为:
- 将
zstring.c
编译为目标文件(例如gcc -c -o zstring.o zstring.c
) 创建一个名为
zstring.h
的头文件:#ifndef ZSTRING_H #define ZSTRING_H int luaopen_zstring(lua_State *L); #endif
在主源文件中包含 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; }
- 使用链接的
zstring.o
目标文件编译主文件(例如gcc -o myprogram main.c zstring.o
)
关于将lua共享对象编译为嵌入式c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23378891/