Lua 5.2: 绑定和原生扩展:lua_register()由于缺乏LUA_GLOBALSINDEX而导致段错误。

Lua教程遍布网络,展示了如何使用lua_register()在扩展DLL或其他实现中公开函数:

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

static int pushlua3(lua_State *L)
{
  lua_pushnumber(L, 3);
  return 1;
}

int luaopen_lua3pushbinder(lua_State *L)
{
  lua_register(L,"pushlua3", pushlua3);
  return 0;
}

lua_register()是宏而不是函数,这是来自5.2手册的内容:

http://www.lua.org/manual/5.2/manual.html#lua_register

[-0,+0,e]

void lua_register (lua_State *L,
               const char *name,
               lua_CFunction f);

将C函数f设置为全局名称name的新值。它被定义为宏:

 #define lua_register(L,n,f) \
        (lua_pushcfunction(L, f), lua_setglobal(L, n))

如果您单独使用这些函数,lua_pushcfunction是可以的,但lua_setglobal会崩溃,因为它试图引用LUA_GLOBALSINDEX,并在运行时而不是编译时失败。

那么现在实现lua_register()的正确方法是什么呢?

我有点指望当Lua转向5.2并重新处理与LUA_GLOBALSINDEX相对应的概念,因此lua_register()将合理地更改为以“新”方式执行。

那么,Ubuntu没有捕捉到的lua5.2头文件是否有更新?我应该有一个包含路径指向/usr/include/lua5.2然后我就不会遇到这个问题了吗?我的盒子上只有Lua 5.1包含目录。

谢谢您提供的任何帮助。

点赞
用户2820433
用户2820433

答案是,在Ubuntu 13.04上,Ubuntu软件中心告诉我有lua5.2的存在,但没有告诉我liblua5.2-0-dev的存在。

我使用apt-get根据lhf的建议找到了它,因为我需要5.2头文件。

结果,我的Lua脚本调用本地dll / so演示非常成功。

2013-09-26 23:06:09