如何设置一个";要求;要从LUACAPI返回表/模块?
我想仅从C API添加一个如何设置一个";要求;要从LUACAPI返回表/模块?,c,lua,C,Lua,我想仅从C API添加一个requireable模块 --lua.lua local c_module = require("c_module") c_module.doWork() 要实现这一点,我必须使用哪些API函数?当加载带有require的共享库时,Lua会查找名为luaopen\uuu的函数,其中是模块名称,点替换为下划线(因此需要“foo.bar”)将查找luaopen\u foo\u bar,但连字符会得到特殊处理;请参阅Lua手册) 此函数应为常规的lua_cf函数;也就是说
require
able模块
--lua.lua
local c_module = require("c_module")
c_module.doWork()
要实现这一点,我必须使用哪些API函数?当加载带有
require
的共享库时,Lua会查找名为luaopen\uuu
的函数,其中
是模块名称,点替换为下划线(因此需要“foo.bar”)
将查找luaopen\u foo\u bar
,但连字符会得到特殊处理;请参阅Lua手册)
此函数应为常规的lua_cf函数
;也就是说,它将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;
}
(这是针对Lua 5.1的,尽管5.2的等效代码应该非常相似,如果不相同的话。还要确保从共享库导出luaopen_uuu
函数。)
C加载器的完整行为可以在这里找到:如果没有单独的库名为
foo.so/.dll
,函数luaopen\u foo必须注册为cclosure作为package.preload.foo
。这很简单:lua_getglobal(l,“包”);lua_推进管柱(l,“预加载”);lua_可得(l,-2);lua_-pushcclosure(l,luaopen_检验,0);lua_设定域(l,-2,“测试”);lua_settop(l,0)代码>。这样就可以直接在主程序中定义它。@Appleshell:或者,如果您不介意也执行luaopen_test()
,您可以使用Lua 5.2的luaL_requiref()
,它将模块存储在packae.loaded[modname]
中。