5

网络上的 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 设置为全局名称的新值。它被定义为一个宏:

 #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() 体现的概念时,更改 lua_register() 以便它以“新”方式完成它是合理的。

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

tnx 为您提供任何帮助。

4

1 回答 1

1

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

我使用 apt-get 根据我需要 5.2 标头的 lhf 建议找到它。

我的 lua 脚本调用原生 dll/so 演示结果很好

于 2013-09-26T23:06:09.340 回答