Lua5.2嵌入在C ++中

时间:2013-10-11 09:51:47

标签: c++ lua lua-5.2

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

main.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

1 个答案:

答案 0 :(得分:3)

首先,为什么不是#include "lua.hpp",它与Lua一起提供并且主要与您的luainc.h有关?

您的代码存在两个问题:

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

  2. 您使用lua_pcall来呼叫helloWorld,但不会测试其返回值。

  3. 当您将lua_pcall更改为lua_call时,会收到以下错误消息:

      

    尝试索引全局'io'(零值)

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

    你可能最好不要让luaL_openlibs打开所有标准的Lua库而不会有任何意外。

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