如何在Lua C API中设置"require"以返回一个表/模块?

我想从 C API 中添加一个可 require 的模块。

--lua.lua
local c_module = require("c_module")
c_module.doWork()

我需要使用哪些 API 函数才能实现这个目标?

点赞
用户646619
用户646619

在使用 require 加载共享库时,Lua会查找一个名为 luaopen_<name> 的函数,其中 <name> 是模块名称,并将其中的点替换为下划线(例如,require "foo.bar" 将查找 luaopen_foo_bar,但连字符需要特殊处理,请参阅Lua手册)。

该函数应为常规的 lua_CFunction类型;也就是说,它以 lua_State* 作为参数,并返回一个 intrequire会将打包名称作为参数调用此函数,你从函数中返回的值是 require 存储和返回的值。

以下是名为 foo 的模块的示例:

static int bar(lua_State* L) {
    // ...
}

int luaopen_foo(lua_State* L) {
    lua_newtable(L); // 创建打包表

    // 推入和分配每个函数
    lua_pushcfunction(L, &bar);
    lua_setfield(L, -2, "bar");

    // ...

    // 返回打包表
    return 1;
}

(这是针对Lua 5.1的,但是对于5.2而言,相应的代码非常相似,甚至相同。还要确保 luaopen_函数从共享库中导出。)

有关C加载器的完整行为,请参阅此处:http://www.lua.org/manual/5.1/manual.html#pdf-package.loaders

2014-04-30 15:57:09