为什么解释器会提示库名为“math”不存在?

为什么解释器会提示库名为“math”不存在?

据我所知,在Lua-5.3.5上调用luaL_newstate时会加载此库。

#include "lua.hpp"
#include <iostream>
#include <assert.h>
#include <fstream>

int main()
{
    struct lua_State *L = luaL_newstate();

    int ret;

    std::string fileName("co.lua");
    if(fileName.empty())
    {
        std::cout << "文件名为空" << std::endl;
        return -1;
    }

    std::ifstream fileScript(fileName, fileScript.in|std::ios::ate);

    if(!fileScript.is_open())
    {
        std::cout << "打开文件失败" << std::endl;
        return -2;
    }

    size_t size = fileScript.tellg();

    if(size <= 0)
    {
        std::cout << "文件没有有效内容" << std::endl;
        return -3;
    }

    std::string textCont(size, '\0');

    fileScript.seekg(0);
    fileScript.read(&textCont[0], size);

    if((ret=luaL_loadbuffer(L, textCont.data(), textCont.length(), "co.lua")) == LUA_OK)
    {
        if((ret=lua_pcall(L, 0, LUA_MULTRET, 0)) != LUA_OK)
        {
            std::cout << "调用lua_pcall()时出错:" << ret << std::endl;
            if(lua_isstring(L, -1))
            {
                const char *errMsg = lua_tostring(L, -1);
                lua_pop(L, 1);
                std::cout << "脚本运行遇到错误:" << errMsg << std::endl;
            }
        }
    }
}

以下是名为“co.lua”的文件的代码片段(非常简单):

  a = 1;
  b=2;

  a=a+1;
  math.sin(a)

以下是控制台中的错误消息:

调用lua_pcall()时出错:2
脚本运行遇到错误:[string "co.lua"]:29: attempt to index a nil value (global 'math')
点赞
用户159145
用户159145

文档说明(http://www.lua.org/manual/5.3/manual.html#6)表示,您需要调用 luaL_openlibsluaL_requiref,但这似乎不是您发布的程序的情况。

要访问这些库,C 主机程序应调用 luaL_openlibs 函数,该函数打开所有标准库。

或者(我强调):

或者,主机程序可以通过使用 luaL_requiref 分别打开它们,调用:

  • luaopen_base(基础库)
  • luaopen_package(包库)
  • luaopen_coroutine(协程库)
  • luaopen_string(字符串库)
  • luaopen_utf8(UTF8 库)
  • luaopen_table(表库)
  • luaopen_math(数学库)
  • luaopen_io(I/O 库)
  • luaopen_os(操作系统库)
  • luaopen_debug(调试库)。 这些函数在 lualib.h 中声明。

因此,请将程序的前几行更改为以下内容。

您还需要比较luaL_newstate 的返回值和 NULL 并处理该错误情况。

```` int main() { struct lua_State *L = luaL_newstate(); if( L == NULL ) { puts( "Lua failed to initialize." ); exit(1); }

luaL_openlibs( L );

// etc

```

2021-01-08 09:36:40