STATUS: 故障中 / 0.884 [fslasht kg]
(この日記の結論:VC6ではこのままでは駄目、VC7では多分大丈夫そう)
LuaのVisualC++用のlibファイルは公式サイトに置いてないので、以前の日記に書いたように「VisualCから使う方法 」 (みはえる氏のwiki)のページからダウンロードしたファイルをいじって使ってました。
ところが、今日CaLuaライブラリのアーカイブをみたらまるごとLuaのlibファイルが入ってました。
これそのまま使えたらいいな~
VisualC++6.0のプロジェクトのフォルダの中に「lua」フォルダを作ってその中に、CaLua内の「lib」「include」フォルダをコピーしました。
自分のプログラムのヘッダに以下のコードを追加。
extern "C" {
#include "Lua/include/lua.h"
#include "Lua/include/lualib.h"
#include "Lua/include/lauxlib.h"
};
プロジェクトの設定で、「リンク」タブの「オブジェクト/ライブラリ モジュール」欄の以下のライブラリを追加
lua/lib/lua50.lib lua/lib/lualib.lib
とりあえず、ソースにLuaのコードを追加。
lua_State *m_pLua;
m_pLua = lua_open();
それではビルド!
リンク中...
LINK : warning LNK4098: defaultlib "MSVCRT" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
lua50.lib(llex.obj) : error LNK2001: 外部シンボル "___security_cookie" は未解決です
lua50.lib(ldo.obj) : error LNK2001: 外部シンボル "___security_cookie" は未解決です
lua50.lib(ldebug.obj) : error LNK2001: 外部シンボル "___security_cookie" は未解決です
lua50.lib(lvm.obj) : error LNK2001: 外部シンボル "___security_cookie" は未解決です
lua50.lib(llex.obj) : error LNK2001: 外部シンボル "@__security_check_cookie@4" は未解決です
lua50.lib(ldo.obj) : error LNK2001: 外部シンボル "@__security_check_cookie@4" は未解決です
lua50.lib(ldebug.obj) : error LNK2001: 外部シンボル "@__security_check_cookie@4" は未解決です
lua50.lib(lvm.obj) : error LNK2001: 外部シンボル "@__security_check_cookie@4" は未解決です
lua50.lib(ltable.obj) : error LNK2001: 外部シンボル "__ftol2" は未解決です
lua50.lib(lundump.obj) : error LNK2001: 外部シンボル "__ftol2" は未解決です
lua50.lib(lcode.obj) : error LNK2001: 外部シンボル "__ftol2" は未解決です
Debug/testFTEzLuaClass.exe : fatal error LNK1120: 外部参照 3 が未解決です。
link.exe の実行エラー
コンパイルは通りましたが、リンクに失敗してしました。
「___security_cookie」って何~? あと、「__ftol2」?
___security_cookieと__ftol2でぐぐったら、これについて書いてあるページ「ObjectARX Programming Tips (Main)」を見つけました。
それによると…
● ___security_cookie
VC7(=VC.net)から搭載された新機能で、バッファーオーバーランとかを防ぐための機能らしい。
VC6でもリンクできるライブラリを作るときは、プロジェクトの設定の「C/C++->Code Generation. Change the setting for 'Buffer Security Check'」を'No'にする必要があるとのこと。
…ということは、いまここにある lib ファイルはそのままでは使えないのか。ガーン
CaLua自体のプロジェクト自体、VC7でビルドしているっぽい(プロジェクトファイルが、.slnだ)ので、いまどきVC6あたりで開発しているのが悪いのかなあ。
● __ftol2
VC6のC libには含まれていない関数。
VC7のプロジェクトではこんな感じに書いておけばよいとのこと
#if (_MSC_VER >= 1300) && (WINVER < 0x0500)
//VC7 or later, building with pre-VC7 runtime libraries
extern "C" long _ftol( double ); //defined by VC6 C libs
extern "C" long _ftol2( double dblSource ) { return _ftol( dblSource ); }
#endif
VC6で使うときも、
extern "C" long _ftol( double ); //defined by VC6 C libs
extern "C" long _ftol2( double dblSource ) { return _ftol( dblSource ); }
だけ書いておけばいいのかなあ。どうせ、luaのなかではこの関数使ってないだろうし。
【結論】
そういうわけで、Luaのlibファイルをそのまま持ってきて使っちゃおう作戦は失敗でした(VC6では)。
VC7で使う場合は、そのまま使えると思うので、これ(CaLua同梱のLib)使えばいいんじゃないでしょうか。
ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家