lua - 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会加载字符串库。
解决方案
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
。
推荐阅读
- django - 在 Django 中切片 TextField() 的内容
- c# - 如何创建 Unity3d Cinemachine 3rd 人移动滑动相机?
- python - 你将如何在 pygame 中添加碰撞?
- python - 如何从 SLP 协议中获取服务?
- azure - 如何在开发过程中同意 Azure Active Directory 企业应用程序进行多租户登录而无需发布者批准?
- java - 在 Spring HandlerInterceptor 中返回 ReponseEntity
- html - 在移动设备上查看时,我的网页在页面底部显示字段集,但在桌面上查看时正确显示
- c# - UWP Grid Splitter 总是粘在鼠标上
- bash - 为什么虚拟终端在 Gnome 终端工作时会在 eval 上抛出错误?
- omnet++ - 将 VeinsInetCar 转换为 RSU 时出错