2012-01-20 9 views
32

私は、いくつかのエクスポート関数を呼び出すのluaスクリプトをコンパイルしたファイルへの結果のバイトコードを保存してから、このバイトコードをロードし、それを実行しようとしているが、私は持っていませんこれを行う方法の例が見つかりました。どのようにこれを行うにはどのような例がありますか?これどうやってするの?コンパイルLuaのコード、店のバイトコードし、それをロードして実行

編集:これはすべての非常に簡単です、私はLuaの+ Luabind(C++)を

答えて

51

使用しています。

まず、あなたはそれを実行せずにのLuaスクリプトをロードします。あなたがエクスポートされた関数にLua状態を接続しているかどうかは関係ありません。スクリプトファイルをコンパイルするだけです。

luaL_loadfileは、C標準ライブラリ関数を使用してディスクからファイルを読み込み、lua_Stateにロードすることができます。また、ファイルを文字列にロードしてluaL_loadstringを使用してlua_Stateにロードすることもできます。

これらの機能の両方がthe documentation for lua_load通り戻り値とコンパイラエラーを放出します。

コンパイルが成功した場合、lua_Stateは今、スタックの最上部にあるLuaの関数としてコンパイルLuaのチャンクを持っています。コンパイルされたバイナリを取得するには、lua_dump関数を使用する必要があります。コールバックインターフェイスを使用してデータを渡すので、やや複雑です。 the documentation for detailsを参照してください。

は、そのプロセスが完了したら、コンパイル済みのLuaのバイトコードを持っています。それをあなたが選んだファイルに押し込みます。ただ覚えておいてください:バイナリと書いてください。

それはバイトコードをロードするための時間が来るとき、あなたがする必要があるすべてはあなたが前にやったまさに... です。よくほとんど。 Luaには、与えられた "文字列"がLuaのソース文字列またはバイトコードであることを検出するヒューリスティックがあります。だから、あなたは前と同じようにluaL_loadfileでバイトコードを読み込むことができます。

違いは、バイトコードでluaL_loadstringを使用することができないということです。この関数は、NULLで終了する文字列を予期しています。バイトコードにはNULL文字が埋め込まれていることがあります。特殊なファイルシステムなどを使用しているため、ファイルIOを自分で実行したい場合は、lua_loadを直接使用する必要があります。どちらもlua_dumpのようなコールバックインターフェイスを使用します。だからread up on how to use it

+1

このような健全な答えがありましたら願います。 – vines

+0

偉大な答え、それはまさに私がそれがそうであると思ったものですが、私はちょうど何を使うべきかを知らなかった。やってみます。さて、このようなもの(明確かつ客観的)をFAQやドキュメンテーションに載せることがどれほど難しいか教えてください。ありがとうございました! – WoLfulus

+5

@ WoLfulus: "Lua load bytecode"をGoogledした場合、[非常に最初のリンク](http://csl.sublevel3.org/lua/)はあなたが知る必要があるすべてをあなたに伝えていました。だから私はこれに関するFAQの必要性を見ていない。また、アプリケーション 'luac'はすでにLuaスクリプトをバイトコードにコンパイルすることができますので、プログラムを実行する必要はありません。だから、実際には、FAQの必要はありません。 Googleの正当な使用。 –

関連する問題