【问题标题】:luabind: Can't call basic lua functions like print, tostringluabind:不能调用基本的 lua 函数,如 print、tostring
【发布时间】:2012-03-14 22:27:03
【问题描述】:

我猜是一个非常基本的问题:

调用lua的C++代码如下:

lua_State* m_L;
m_L = lua_open();
luabind::open(m_L);
luaL_dofile(m_L, "test.lua");
try {
    luabind::call_function<void>(m_L, "main");
} catch (luabind::error& e) {
    std::string error = lua_tostring(e.state(), -1);
    std::cout << error << std::endl;
}
lua_close(m_L);

现在test.lua有以下内容:

function main()
print "1"
end

执行时我收到错误:

test.lua:2: attempt to call global 'print' (a nil value)

有什么问题?跟环境有关系吗?我认为像 print 这样的函数是在全局环境中定义的。那为什么找不到呢?

非常感谢。

【问题讨论】:

  • 好吧,我想通了:luaopen_base(m_L);需要在lua_open()之后调用
  • 如果你也打算使用它们,你需要调用 luaopen_string(m_L)、luaopen_math(m_L) 等来打开相应的内置 lua 库。
  • @chris.schuette:您应该回答自己的问题并接受该答案(从而将问题标记为已完成)或删除问题。
  • @NicolBolas 我认为我还不能回答我自己的问题 - 我认为我的声誉太低了。你认为删除这个问题合适吗?也许有人会在这里发现这些信息很有价值......

标签: c++ lua environment luabind


【解决方案1】:

如你所见,你必须调用luaopen_base 来获取print 和其他基本函数。然后你需要调用luaopen_stringluaopen_math来获取基本模块和函数。而不是手动写出来,可以用luaL_openlibs一次加载所有Lua基本函数:

lua_State* m_L = luaL_newstate();
luaL_openlibs(m_L);

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 2011-09-12
    • 2018-07-01
    • 2011-11-18
    • 2012-06-13
    • 2014-09-25
    • 2018-05-11
    • 2014-08-05
    • 2013-08-13
    相关资源
    最近更新 更多