首页 > 解决方案 > lua,使用有限模块从 C 调用脚本,string.len 上的错误

问题描述

我正在测试从 C. LUA 5.3.5 调用 LUA 脚本。

为了收紧使用的库,在 CI 中使用

L = luaL_newstate();
luaopen_base(L);
luaopen_string(L);
luaL_dofile(L, szFilename);
int tipo = lua_getglobal(L, "check");
int error = lua_pcall(L, 0, 0, 0);

(代码简化且没有错误处理)

这是示例 LUA 脚本:

function check()
        local buffer = "hello"
        buffer = buffer .. " world!"
        print(buffer)
        print(string.len(buffer))
end

为什么string.len返回错误?

尝试索引一个 nil 值(全局“字符串”)

我以为luaopen_string会加载字符串库。

标签: lua

解决方案


luaopen_string没有定义全局变量string:它只是将表留在堆栈上。也一样

luaopen_string(L);
lua_setglobal(L,"string");

或者,使用luaL_requiref而不是直接调用luaopen_string

luaL_requiref(L,"string", luaopen_string,1);

见手册第 6 节最后一段;

要访问这些库,C 主机程序应调用该luaL_openlibs函数,该函数将打开所有标准库。或者,宿主程序可以单独打开它们,方法是使用 luaL_requiref 调用 ... luaopen_string(对于字符串库)...这些函数在 lualib.h 中声明。

最后,如果您想自定义程序使用的标准库集,请编辑linit.c并将其添加到您的项目中。更改loadedlibs中的列表。然后调用luaL_openlibs


推荐阅读