调用luaopen_ffi后找不到ffi名称空间

时间:2016-04-14 01:35:47

标签: c++ lua

我有一个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不是正确的方法?

1 个答案:

答案 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模块中一样。