結果だけでなく過程も見てください

たい焼きさんの日々の奮闘を綴る日記です。

luabindをビルドする方法

ちょっと説明する順番が前後しますが、
今回はluabindのビルド方法を紹介します。

LuaC/C++をそのまま連携すると、いちいちグルー関数(C/C++Luaの橋渡しをするための関数)
を定義しなければならず、数が多くなってくると大変です。

luabindを使えば、メンバ関数だろうとグローバルな関数だろうと
C++側のluabind関数で一発登録して、Luaから利用することができます。

luabindのダウンロードはこちら(自分は0.9.1)
http://sourceforge.net/projects/luabind/files/luabind

さてコンパイルにはboostとLuaが必要です。
boostということは、bjamが必要ですね。

bjamのダウンロードはこちら(自分は3.1.18)
http://sourceforge.net/projects/boost/files/boost-jam

boostのダウンロードはこちら(自分は1.46.1)
http://sourceforge.net/projects/boost/files/boost-binaries

ダウンロードしたファイル群をそれぞれ以下のように配置しました。

[C:\]
└[Lib]
 ├[lua5.1]
 │└INSTALL等のファイルがある場所
 ├[boost_1_46_1]
 │└INSTALL等のファイルがある場所
 └[luabind-0.9.1]
  ├INSTALL等のファイルがある場所
  ├bjam.exe                            ←bjam.exeはここに配置する
  └[stage]                             ←ライブラリの出力先

コマンドプロンプトから以下を行います。
以下のパスに移動してください。

C:\Lib\luabind-0.9.1

まずは環境変数の設定です。

set LUA_PATH=C:\Lib\lua5.1
set BOOST_ROOT=C:\Lib\boost_1_46_1

次にbjamを実行します。
luabindのライブラリについては静的リンク(link=staticの部分)でいこうと思います。
runtime-linkはCランタイムライブラリのリンク方法です。
自分はVS2005なのでmsvc-8.0ですが、2008の場合はmsvc-9.0、2010の場合はmsvc-10.0を指定してください。
使用目的に合わせて以下のいずれかを実行します。
※2013/03/20追記 最近は--toolset=msvcとすれば自動的に判定してくれるらしいです

bjam --toolset=msvc-8.0 link=static runtime-link=static debug stage
bjam --toolset=msvc-8.0 link=static runtime-link=shared debug stage
bjam --toolset=msvc-8.0 link=static runtime-link=static release stage
bjam --toolset=msvc-8.0 link=static runtime-link=shared release stage

無事にコンパイルが終われば上記のstageフォルダにライブラリが出力されているハズです。


さて、ここで自分がハマった箇所を紹介します。

作成したluabindのライブラリをリンクして自前のプロジェクトをビルドすると
リンクエラー(LNK2005)が出力されることがあります。

原因は以下のサイトに書かれていました。

/MD、/MT、/LD (ランタイム ライブラリの使用)
http://msdn.microsoft.com/ja-jp/library/2kzt1wy3%28v=vs.80%29.aspx
リンカの特定の呼び出しに渡されるすべてのモジュールは、同じランタイム ライブラリ コンパイラ オプション (/MD、/MT、/LD) を指定してコンパイルされている必要があります。

つまり今回のluabindだけでなく、リンクしているライブラリ全てで
上記オプションを統一する必要があるということです。

特にエラーの内容がCのランタイムライブラリのシンボルが複数回定義されていると
言われる場合の原因はだいたいがコレでしょう。

自分はDirectX,Ogg,Vorbis,Lua,Luabind,マルチメディア系のライブラリ,自作の共通関数をまとめたライブラリを
リンクしていましたが、これらすべてオプションを統一する必要があります。

統一できていない場合はオプションを統一してビルドしなおす等の処置が必要なので注意です。
こんなので一週間くらい悩んでしまいました。泣けてきた(T_T)