You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:09:23