如何通过Lua C API向package.searchers添加自定义模块搜索器
Lua自定义require搜索器实现问题记录
需求目标
希望Lua中的require函数能够借助Physfs从游戏资源归档文件中查找模块。前期调研得知实现该功能需要向package.searchers表添加自定义C函数,但作为Lua及Lua嵌入开发的新手,始终未能成功完成该操作。
遇到的问题
存在核心疑问:package表及其内部的所有嵌套表是否不属于全局变量?
尝试在Lua端向该表添加自定义搜索函数时,因package值为nil导致操作失败,尝试使用的Lua代码如下:
package.searchers[#package.searchers + 1] = function(name) print("searchers as been called.") end
初始实现代码
最初加载package库及其他Lua标准库的核心C++实现如下:
const luaL_Reg lualibs[] = { { LUA_COLIBNAME, luaopen_base }, { LUA_LOADLIBNAME, luaopen_package }, { LUA_TABLIBNAME, luaopen_table }, { LUA_IOLIBNAME, luaopen_io }, { LUA_OSLIBNAME, luaopen_os }, { LUA_STRLIBNAME, luaopen_string }, { LUA_MATHLIBNAME, luaopen_math }, { LUA_DBLIBNAME, luaopen_debug }, { NULL, NULL } }; lua_State* ls = luaL_newstate(); const luaL_Reg* lib = lualibs; for (; lib->func; lib++) { lua_pushcfunction(ls, lib->func); lua_pushstring(ls, lib->name); lua_call(ls, 1, 0); }
最终解决方案
在Egor Skriptunoff的帮助下确认,直接使用Lua官方提供的luaL_openlibs接口加载标准库即可解决package为nil的问题。标准库加载完成后,可通过如下C++代码完成自定义Physfs搜索器的注册:
lua_getglobal(_ls, LUA_LOADLIBNAME); if (!lua_istable(_ls, -1)) return; lua_getfield(_ls, -1, "searchers"); if (!lua_istable(_ls, -1)) return; lua_pushvalue(_ls, -2); lua_pushcclosure(_ls, mysearcher, 1); lua_rawseti(_ls, -2, 5); lua_setfield(_ls, -2, "searchers");
开发环境说明
- Lua版本:5.4
- 宿主项目类型:C++项目
内容的提问来源于stack exchange,提问作者HITOA
相关产品推荐
相关产品推荐

