1

アプリケーションで Lua をバインドしようとしていますが、Lua を C++ にバインドする方法をテストしようとしています。main()開始時にスクリプトから関数を呼び出したいので、私の問題は非常に奇妙ですluaL_loadfile。私のコード:

#include <iostream>
#include <cstdlib>
#include <stdio.h>

#include "lua.hpp"
#include "lauxlib.h"
#include "lualib.h"

using namespace std;

int main(int argc, char **argv) {
    lua_State* lua = luaL_newstate();
    luaL_openlibs(lua);

    if (luaL_loadfile(lua, "test.lua") != 0) {
        std::cout << lua_tostring(lua, -1) << "\n";
        lua_pop(lua, 1);
        return 1;
    }

    lua_getfield(lua, LUA_REGISTRYINDEX, "main");
    if (lua_pcall(lua, 0, 1, 0) != 0) {
        printf("Error running function 'main': %s\n", lua_tostring(lua, -1));
        return 1;
    }

    lua_close(lua);

    return 0;
}

私の出力は次のとおりです。

関数 'main' の実行中にエラーが発生しました: nil 値を呼び出そうとしました

4

2 に答える 2

2

luaL_dofileの代わりに試してくださいluaL_loadfile

これは、最もよくある間違いの 1 つですluaL_loadfile。ファイルをロードしますが、実行しません。ロードされたファイルを表す関数をスタックに残すだけで、すぐに呼び出すことができます。関数mainは、スクリプトの実行時、つまりスクリプト関数が呼び出されたときにのみ定義されます。エラーメッセージはそう伝えようとしています。(あなたのスクリプトは と呼ばれる関数を定義していると仮定しますmain。それは実際には必要ありませんが、無害です。)

于 2013-08-22T00:30:56.783 に答える
2

Lua 5.2 をVisual Studio 2005 コンソール プロジェクトに埋め込む例を、この記事のソースと共にまとめました。

main() はアプリケーションのエントリ ポイントであり、一度だけ実行する必要がある Lua の初期化処理があるため、lua スクリプトから main() を呼び出すのは本当に意味がありません。

私がまとめた例と記事は、C++ で Lua 5.2 を使用し、Lua スクリプトから作成した C 関数を呼び出すことができることを示しています。この例では、C++ プログラムからの Lua 関数の呼び出しも示しています。

Visual Studio 2005 を使用して約 1 年前にこれを行いました。Visual Studio 2005 から 2012 に移行するのは簡単だと思います。別のコンパイラや開発環境に移植するのがどれほど簡単かはわかりません。少なくとも、Visual Studio 2005 の Windows コンソール アプリケーションで使用される _tmain() 関数の名前を main() に変更する必要があります。

于 2013-08-21T23:16:35.423 に答える