fslasht (3370) の日記

2004 年 05 月 04 日
午後 05:55

[lua] LuaのVC用libファイルはCaLuaからGET?

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)使えばいいんじゃないでしょうか。

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

ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家

処理中...