我想仅从C API添加require
能力模块。
--lua.lua
local c_module = require("c_module")
c_module.doWork()
我必须使用哪些API函数才能实现这一目标?
答案 0 :(得分:6)
使用require
加载共享库时,Lua会查找名为luaopen_<name>
的函数,其中<name>
是模块名称,其中的点用下划线替换(因此require "foo.bar"
将luaopen_foo_bar
寻找lua_CFunction
,但连字符得到特殊处理;参见Lua手册。)
此功能应该是常规lua_State*
;也就是说,它需要int
作为参数并返回require
。 require
使用包名称作为参数调用此函数,并且从函数返回的值是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