カテゴリー別アーカイブ: Lua

luaで共有ライブラリを作成する方法

Luaバイナリをソースファイルからコンパイルして作成するとき、

標準では静的ライブラリが生成されます。

通常Luaを組み込み用途で使用するときは静的ライブラリで十分なのですが、

時には共有ライブラリが欲しくなるので、作成してみます。

(lua5.1を想定しています)

src/Makefileに以下を追加する。

LUA_O=lua.oと書かれた行の下に、以下の行を挿入する。

LUA_SO=liblua5.1.so

次の行の最後に、$(LUA_SO)を追記する。

ALL_T=$(LUA_A) $(LUA_T) $(LUAC_T)

ALL_T=$(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)

clean:と書かれた行の前に、以下の2行を挿入する。

(2行の前後には1行の空行があるようにする)

$(LUA_SO): $(CORE_O) $(LIB_O)
$(CC) -o $@ -shared $?

保存する。

次にMakefileを下記のように編集する。

TO_LIB= liblua.aとなっている行の最後に liblua5.1.soを追記する。

TO_LIB=liblua.a liblua5.1.so

これで、makeするとliblua5.1.soが生成されます。

Luaの配列展開

前回call_user_func関数の実装を行いました。

かなり便利になったのですが、すぐに1点の曇りが見つかりました。

そう、call_user_funcの場合、引数は直接指定しないといけないのです。

この手の関数を使う場面では、引数もあらかじめ配列に格納しておき、呼び出すことが多いのです。

例えば、以下のような関数が定義されていたとします。

[sourcecode language=”cpp”]
function funcA(a,b,c)
print(a,b,c)
end
[/sourcecode]

これを普通に呼び出すのは簡単

funcA("a", "b", "c")

実行結果
a	b	c

しかし、とあるケースではこの引数を配列にしておきたいときがあります。

args = {"a", "b", "c"}

さて、funcAをどう呼び出すのか?

funcA(args)

実行結果
table: 0x806f168	nil	nil

当然ですが、第1引数にテーブルの参照が渡っているのです。

お察しのよろしい方は、タイトルでピンとくるでしょう。

そう、unpack関数があるのです。

funcA(unpack(args))

実行結果
a	b	c

あっという間に解決しました。