C++ + Lua for WindowsでMetaluaを使う

C++へLuaを組み込んでいる場合にMetaluaを使用するやりかたがわかったのでメモしておきます。LuaはLua for Windowsの5.1.4を使っています。
ちなみにMetaluaというのは、Luaにマクロ等の拡張機能を追加できるものです。Lua for Windowsに最初から入っているのですぐ使用できます。

まずはMetaluaの文法に則ってスクリプトを書きます(とりあえず script.mlua とします)。このままでは実行出来ませんのでMetaluaでコンパイルします。コマンドプロンプトにて以下を実行します。

metalua script.mlua -o script.luac -v --no-runtime

※–no-runtimeパラメータは状況により付けたり付けなかったり

この”metalua”というのはLuaのインストール先にあるバッチファイルです。見つからないというエラーが出る場合はパスを通してください(Win7ならC:\Program Files (x86)\Lua とかですね)
パラメータ -o でコンパイル後のファイル名を決めています。-v は進捗状況を細かく見たいという指定です。

最後の –no-runtime ですが、これはコンパイル後のスクリプトが自動でMetaluaライブラリをロードしないようにするオプションです。これを付けないと、コンパイル後のスクリプトに require “metalua.runtime” が付加されます。その場合、今回はC++からLuaスクリプトを呼び出すという前提なので、C++側の実行ファイルと同じフォルダにMetaluaライブラリが一式揃っていないとエラーになってしまうので注意してください。もちろん、–no-runtimeを付けた場合は他の方法でMetaluaライブラリをロードしておく必要があります。自分はprecompiler.luaを使ってruntime.luaがロードしている3つのファイル(base.lua, string2.lua, table2.lua)をコンパイルしておきC++に組み込む形にしました。具体的にはLuaインストール先のluaフォルダで以下を実行します。

lua precompiler.lua -o metalua -l metalua/?.lua metalua/base.lua metalua/string2.lua metalua/table2.lua

するとmetalua.cとmetalua.hが生成されるのでC++プロジェクトに追加し、そのファイル内に定義されている関数をlua_open()の後くらいに実行することでライブラリをロードできます。

そしてmetaluaコマンドにより生成されたファイルを読み込み、luaL_loadbuffer(), lua_pcall()して無事実行できました。

コメントを残す

メールアドレスが公開されることはありません。