3

Lua を C++ に組み込むのは初めてです。2 日前から検索していますが、ほとんどのインターネット チュートリアルは lua5.2 と互換性のない lua5.1 を使用しています。そこで、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
4

1 に答える 1

3

まず、#include "lua.hpp"Lua に付属していて、ほとんどのことを行うのluainc.hはなぜでしょうか。

コードには 2 つの問題があります。

  1. 失敗してもエラー メッセージは出力されluadL_loadfileません。

  2. lua_pcall呼び出しに使用しますhelloWorldが、その戻り値をテストしません。

に変更lua_pcallすると、次のlua_callエラー メッセージが表示されます。

グローバル 'io' (nil 値) のインデックス作成を試みます

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 に答える