我希望能够通过C API单独添加可
我需要使用哪些API函数才能实现这个功能?
require
的模块。--lua.lua
local c_module = require("c_module")
c_module.doWork()
我需要使用哪些API函数才能实现这个功能?
require
加载共享库时,Lua会查找名为luaopen_<name>
的函数(其中<name>
是模块名称,用下划线替换点号,因此require "foo.bar"
将查找luaopen_foo_bar
,但短横线有特殊处理,请参阅Lua手册)。这个函数应该是一个常规的lua_CFunction
,即它以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_
函数从共享库中导出。)
foo.so/.dll
的单独库,函数luaopen_foo
必须被注册为cclosure作为package.preload.foo
。这很简单:lua_getglobal(l, "package"); lua_pushstring(l, "preload"); lua_gettable(l, -2); lua_pushcclosure(l, luaopen_test, 0); lua_setfield(l, -2, "test"); lua_settop(l, 0);
。这样可以直接在主程序中定义它。 - Appleshellluaopen_test()
,您可以使用Lua 5.2的luaL_requiref()
,它将模块存储在package.loaded [modname]
中。 - Niccolo M.