我有这段代码(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
并使用它
怎么做?
答案 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
,例如)。然后,您可以将该对象文件与主要源链接。
执行此操作的步骤大致如下:
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
)