Luaのお勉強#1

きっかけ

Luaに興味を持ったきっかけはこれ。

スクリプト言語からCのプログラムを呼ぶんではなく、あくまでCとかC++をメイン言語として何かしたい(実際に何をしたいかは漠然と考えている)というのが頭にあって、でもメンドクサイのはやだなあ、と思っていたらLuaってのが最近のゲーム開発でホット(? squirrelとかも興味アリ)だということを知り、本を買った。

それを参考に初歩の初歩のC++Luaの組み込みを書いてみた。ほとんど、本の丸写しですけど。

コード

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

#include "lua.hpp"

int main(void)
{
	using namespace std;

	string strLuaScript1 = 
		"print('hello Lua world');";
	string strLuaScript2 = 
		"return 'one', 'two', 'three'";

	lua_State *L = lua_open();
	luaL_openlibs(L);
	luaL_dostring(L, strLuaScript1.c_str());
	luaL_dostring(L, strLuaScript2.c_str());

	string result1 = lua_tostring(L, 1);
	string result2 = lua_tostring(L, 2);
	string result3 = lua_tostring(L, 3);
	cout << result1 << "|" << result2 << "|" << result3 << endl;

	return 0;
}

実行結果


わーなんかでたー

はまったところ

  • namespace

はじめ、c++のnamespaceがよくわかってなくて、main全体を

namespace std
{
int main(void)
{
    .......
}
}

とかやってしまって、エントリポイントが見つからないと怒られ、ハマった。std::mainとなっていたのにも気づかずに。

  • dllとかlibとか

先日、dllとlibをビルドしたんだが、実行ファイルの出力ディレクトリにlua51.dllが必要みたいなので、コピーした。
lua51.libを依存ライブラリとしているんだが、静的ライブラリとして組み込まれていないのかな?

	lua_State *L = lua_open();

ここらでタブン、動的に読み込んでいるに違いない。よくわからん。調べてみる。

全然違った。http://exlight.net/devel/windows/dll/windll.htmlによると、暗黙的なリンクということらしい。luaMakefileが静的ライブラリの.libを作るのではなく、インポートライブラリとして、作成されるということか。紛らわしい。Windowsの動的リンクライブラリのアーキテクチャなんて久々すぎて忘れちゃったよ〜。

使い慣れていない言語に触ると、言語固有のシンタックスとか、はまるよな〜。

って仕事の合間に関係ないことをやっているおれ。