我有一个C ++程序,创建将创建一个lua_State并调用自定义lua代码。在调用自定义lua函数之前,使用lua_State调用luaopen_ffi():
luaopen_ffi(lua_state_);
但是,当我的程序执行自定义lua代码时,它找不到ffi。我进一步打印出ffi的值,遗憾的是它是nil
:
print(ffi) --- which outputs nil
而使用luaopen加载的其他库确实具有非零值,例如
print(io) --- outputs table: 0x400af268
我进一步检查了luaopen_ffi的源代码,它说它不会根据其评论创建一个全局ffi名称空间:
LUALIB_API int luaopen_ffi(lua_State *L) {
CTState *cts = lj_ctype_init(L);
settabV(L, L->top++, (cts->miscmap = lj_tab_new(L, 0, 1)));
cts->finalizer = ffi_finalizer(L);
LJ_LIB_REG(L, NULL, ffi_meta);
/* NOBARRIER: basemt is a GC root. */
setgcref(basemt_it(G(L), LJ_TCDATA), obj2gco(tabV(L->top-1)));
LJ_LIB_REG(L, NULL, ffi_clib);
LJ_LIB_REG(L, NULL, ffi_callback);
/* NOBARRIER: the key is new and lj_tab_newkey() handles the barrier. */
settabV(L, lj_tab_setstr(L, cts->miscmap, &cts->g->strempty), tabV(L->top-1));
L->top--;
lj_clib_default(L, tabV(L->top-1)); /* Create ffi.C default namespace. */
lua_pushliteral(L, LJ_OS_NAME);
lua_pushliteral(L, LJ_ARCH_NAME);
LJ_LIB_REG(L, NULL, ffi); /* Note: no global "ffi" created! */
ffi_register_module(L);
return 1;
}
我也试过了ffi = require("ffi")
但它不起作用:(。
我可以在调用luaopen_ffi后知道如何使用ffi功能吗?或者luaopen_ffi不是正确的方法?
答案 0 :(得分:2)
如果您想要名为#{ stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true }
#{ javascript_include_tag 'application', 'data-turbolinks-track' => true }
的全局广告,请尝试以下方法:
ffi
似乎luaopen_ffi(lua_state_);
lua_setglobal(lua_state_ ,"ffi");
将表保留在堆栈中,就像在Lua模块中一样。