いくつかのエクスポートされた関数を呼び出すluaスクリプトをコンパイルし、結果のバイトコードをファイルに保存してから、このバイトコードをロードして実行しようとしていますが、これを行う方法の例はありません。これを行う方法について利用可能な例はありますか?これどうやってするの?
編集:私はLua + Luabind(C++)を使用しています
これはすべて非常に簡単です。
まず、Luaスクリプトを実行せずに実行します。 Lua状態をエクスポートされた関数に接続しているかどうかは関係ありません。スクリプトファイルをコンパイルするだけです。
luaL_loadfile
を使用できます。C標準ライブラリ関数を使用して、ファイルをディスクから読み取り、lua_State
にロードします。または、ファイルを自分で文字列に読み込み、luaL_loadstring
を使用してlua_State
に読み込むこともできます。
これらの関数はどちらも lua_load
のドキュメント に従って、戻り値とコンパイラエラーを発行します。
コンパイルが成功した場合、lua_State
はコンパイルされたLuaチャンクをスタックの最上部にあるLua関数として持つようになります。コンパイルされたバイナリを取得するには、lua_dump
関数を使用する必要があります。コールバックインターフェイスを使用してデータを渡すため、かなり複雑です。 詳細はドキュメント を参照してください。
そのプロセスが完了すると、コンパイルされたLuaバイトコードができます。それをお好みのファイルに押し込みます。ただ覚えておいてください:テキスト翻訳ではなく、binaryと書いてください。
バイトコードをロードするときになると、あなたがする必要があるのは... まさにあなたが以前にしたこと。よくほとんど。 Luaには、与えられた「文字列」がLuaのソース文字列またはバイトコードであることを検出するヒューリスティックがあります。つまり、以前と同じようにluaL_loadfile
を使用してバイトコードをロードできます。
違いは、バイトコードではluaL_loadstring
を使用できないことです。その関数は、NULLで終了する文字列を期待していますが、これは悪いことです。バイトコードにはNULL文字が埋め込まれている可能性があり、すべてが台無しになります。したがって、ファイルIOを自分で実行したい場合(特別なファイルシステムなどを使用しているため)、lua_load
を直接使用する必要があります。これも、次のようなコールバックインターフェイスを使用します。 lua_dump
。それで、 それを使用する方法を読んでください .