3

我第一次尝试将 Lua 嵌入到 C++ 中。我已经找了2天了,但是大多数互联网tutos都使用lua5.1,它与lua5.2不兼容。所以我阅读了一些 lua 文档,示例源代码,我最终得到了这个:

主.cpp:

#include "luainc.h"
#include <iostream>

int main(){
    int iErr = 0;
    lua_State *lua = luaL_newstate ();  // Open Lua
    luaopen_io (lua);    // Load io library

    if ((iErr = luaL_loadfile (lua, "hw.lua")) == 0)
    {
       std::cout<<"step1"<<std::endl;

       if ((iErr = lua_pcall (lua, 0, LUA_MULTRET, 0)) == 0)
       { 
          std::cout<<"step2"<<std::endl;

          lua_getglobal (lua, "helloWorld");    // Push the function name onto the stack

            if (lua_type(lua, lua_gettop(lua)) == LUA_TNIL) {
                // if the global variable does not exist then we will bail out with an error.
                std::cout<<"global variable not found : helloworld"<<std::endl;

                /* error so we will just clear the Lua virtual stack and then return
if we do not clear the Lua stack, we leave garbage that will cause problems with later 
function calls from the application. we do this rather than use lua_error() because this function
is called from the application and not through Lua. */

                lua_settop (lua, 0);
                return -1;
            }         

          // Function is located in the Global Table
          /* lua_gettable (lua, LUA_GLOBALSINDEX);  */ //lua5.1
          lua_pcall (lua, 0, 0, 0);
       }
    }

    lua_close (lua);

    return 0;
}

hw.lua:

-- Lua Hello World (hw.lua)
function helloWorld ()
   io.write ("hello World")
end

luainc.h:

#ifndef __LUA_INC_H__
#define __LUA_INC_H__

extern "C"
{
   #include </home/renardc/Documents/Programmation/Lua_CPP/lua-5.2.2/src/lua.h>
   #include </home/renardc/Documents/Programmation/Lua_CPP/lua-5.2.2/src/lauxlib.h>
   #include </home/renardc/Documents/Programmation/Lua_CPP/lua-5.2.2/src/lualib.h>
}

#endif // __LUA_INC_H__

我没有错误,输出是:

step1
step2

这应该意味着我的“helloworld”函数已经找到了。但由于我在输出中看不到“Hello World”,我怀疑该函数尚未被调用。我究竟做错了什么 ?

这就是我编译程序的方式:

g++ main.cpp -L/usr/local/include -I/usr/local/include -llua
4

1 回答 1

3

首先,为什么不呢#include "lua.hpp",它是 Lua 自带的,主要做你luainc.h做的事情?

您的代码有两个问题:

  1. 失败时不会发出任何错误消息luadL_loadfile

  2. lua_pcall用来调用helloWorld但不测试它的返回值。

当您更改为时lua_pcalllua_call您会收到此错误消息:

尝试索引全局“io”(一个零值)

这意味着您io在调用后忘记设置全局luaopen_io。只需添加lua_setglobal(lua,"io")即可。与 Lua 5.1 不同,Lua 5.2 不会在您打开库时自动设置全局变量,除非库本身会这样做,这是不鼓励的。

luaL_openlibs毫无意外地打开所有标准 Lua 库可能会更好。

您不妨使用luaL_dofile代替luaL_loadfile并保存第一个lua_pcall. 您仍然需要检查返回值。

于 2013-10-11T10:51:49.137 回答