fslasht (3370) の日記

2004 年 03 月 20 日
午前 05:08

[lua] VisualC++から使ってみよう

STATUS: 故障中

 とりあえずサンプルぐらいは自前でコンパイルしないと、ということでVisaulC++(6.0)用に環境を作ってみました。
 これは自分の間抜けさもあって、さんざんはまって泣きそうでしたが、わかってしまえば簡単なことでした。
( extern "C" を書き忘れてリンクできなかった。それに気づかず、いろんなところからlibとか持ってきたり、ビルドしなおしてみたりおおハマリ。ライブラリのヘッダに extern "C" くらい書いておいてよ~ )

【環境とか】
コンパイラ: VisualC++6.0
OS: Windows2000
lua: version 5.0

● Luaのlibファイルをそろえる

 環境作成にあたり参考にしたサイトは、VisualCから使う方法 (みはえる氏のwiki) です。
 このページの「Lua5_miha2.lzh」をダウンロードしてきて展開してください。

 Lua5/Debug/Lua5.lib …(1)
 このファイルはそのまま使えます。(ReleaseBuildではうまくいかなかったので、DebugBuildだそうです)
 あと、「LibLua.lib」と「LibLuaLib.lib」が足りないので、VCを起動してビルドします。
 Lua5/Lua.dsw をDeveloperStudioで開いてください。
 ClassViewに「LibLua+CRT.libクラス」と「LibLuaLib+CRT.libクラス」がありますので、それぞれビルドしてください。
 ビルド(Debug)すると次のファイルが生成されます。
 Lua5/dbin/LibLua+CRT.lib …(2)
 Lua5/dbin/LibLuaLib+CRT.lib …(3)

 その他必要なヘッダファイルは次の3つです。
 Lua5/include/lua.h …(4)
 Lua5/include/LibLua.h …(5)
 Lua5/include/LibLuaLib.h …(6)

 以上で、必要なファイルがそろいました。
(公式サイトに各コンパイラ用にコンパイル済みの libファイル置いておいてくれたらいいのに…)

● サンプルプログラムを入力

 DeveloperStudioのAppWizardでプロジェクトを作ります。
 とりあえずコンソールアプリ(Win32 Console Application)にします。
 プロジェクト名は「testLua1」とします。
 アプリケーションの種類は「"Hello, World!"アプリケーション(W)」とします。
 これでプロジェクトが出来ました。

 プロジェクトのフォルダに、「lua」というフォルダを掘って、その中にlibファイルとして準備した(1)~(6)のファイルをコピーします。
 (1)~(6)のファイルをプロジェクトに追加します。

 testLua1.cpp に、みはえる氏のサイトの「最小限のテスト」のサンプルコードを入力(コピー)します。
 このままでは以下の理由で動きません。
・ライブラリ、ヘッドのフォルダ位置が違う
・みはえる氏のサンプルは、C言語用だが、いまの手順で作っているのはC++(拡張子がCPPなので)用なので、extern "C"宣言が必要。

「int _tmain(int argc, _TCHAR* argv[])」の行までは以下のように変更してください。

#include "stdafx.h"

extern "C" {
#include "Lua/lua.h"
#include "Lua/lualib.h"
#include "Lua/lauxlib.h"
};

int main(int argc, char* argv[])

※ このあとは元のソースのまま

 あと、みはえる氏のページにあるようにファイル「test.lua」をプロジェクトのフォルダに作ります。
 このファイルがこれから実行するluaスクリプトです。
(このファイルがないと、lua_call関数を呼び出した時点でいきなりプログラムが終了してしまいます。)

 これで準備完了です。
 あとは、F5キー(実行)で実行されます。
 画面には luaスクリプトの実行結果である「35.0000」が表示されるはずです。

 ふぅやっと動いた。

# この蛇足気味の解説はいったい誰に向かって描いているんだろう…

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

処理中...