如何设置“require”从Lua C API返回表/模块?

时间:2014-04-30 15:13:19

标签: c lua

我想仅从C API添加require能力模块。

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

我必须使用哪些API函数才能实现这一目标?

1 个答案:

答案 0 :(得分:6)

使用require加载共享库时,Lua会查找名为luaopen_<name>的函数,其中<name>是模块名称,其中的点用下划线替换(因此require "foo.bar"luaopen_foo_bar寻找lua_CFunction,但连字符得到特殊处理;参见Lua手册。)

此功能应该是常规lua_State*;也就是说,它需要int作为参数并返回requirerequire使用包名称作为参数调用此函数,并且从函数返回的值是foo存储和返回的值。

以下是名为static int bar(lua_State* L) { // ... } int luaopen_foo(lua_State* L) { lua_newtable(L); // Create package table // Push and assign each function lua_pushcfunction(L, &bar); lua_setfield(L, -2, "bar"); // ... // Return package table return 1; } 的模块的示例:

luaopen_

(这适用于Lua 5.1,尽管5.2的等效代码应该非常相似,如果不相同的话。还要确保从共享库中导出{{1}}函数。)

可以在此处找到C加载程序的完整行为:http://www.lua.org/manual/5.1/manual.html#pdf-package.loaders