[Happy Coding]luabind 0.9.1バージョン試行


luabind 0.9.1バージョン試行
1.luabind 0.9.1 linuxバージョンのコンパイルにはbjam binaryが必要
直接copy boost/1.37.0ディレクトリでコンパイルしたbjam binaryを~/binディレクトリに、luabinルートディレクトリでbjamを実行します.
コンパイル前に環境変数BOOST_を設定する必要がありますROOT=~/mylibs/boost/1.37.0/およびLUA_PATH=~/mylibs/lua/5.1/
2.最初のexampleを試してみると、自分のバージョンのlua 5が見つかりました.1 binaryはloadlib関数をサポートしていません
> print(loadlib())
解決策はlua src/luaconf.hファイルでLUA_をCOMPAT_LOADLIBをアクティブにし、lua binaryを再コンパイル
3.C++LUAの拡張ライブラリを作成する:
解決2の後、以下のC++コードを作成します.
#include 
#include 

void greet()
{
    std::cout << "hello world - my luabind try
"; } extern "C" int init(lua_State* L) { using namespace luabind; open(L); module(L) [ def("greet", &greet) ]; return 0; }

その後gccコンパイル:
g++ -o helloworld.so helloworld.cc -fPIC -shared -I/home/zeli/mylibs/boost/1.37.0/include -I/home/zeli/mylibs/luabind-0.9.1/ -I/home/zeli/mylibs/lua/5.1/include -L/home/zeli/mylibs/luabind-0.9.1/lib -L/home/zeli/mylibs/lua/5.1/lib -lluabind -llua

次のコンパイルオプションを
shellスクリプトを生成します(gccmd.sh+x):
echo "-fPIC -shared -I/home/zeli/mylibs/boost/1.37.0/include -I/home/zeli/mylibs/luabind-0.9.1/ -I/home/zeli/mylibs/lua/5.1/include -L/home/zeli/mylibs/luabind-0.9.1/lib -L/home/zeli/mylibs/lua/5.1/lib -lluabind -llua"

これにより、多くの文字を叩くことができます.
g++ -o helloworld.so helloworld.cc `./gcccmd.sh`

現在のディレクトリの下にhelloworldがあります.soファイル生成.さらにldd/nmでhelloworldを見ることができますsoファイルには何が含まれていますか.
4.LUAでC++のコードを呼び出します.
luabindディレクトリでlua binaryを直接実行すると、loadlibは次のエラーに気づきます.
[zeli@p03bc luabind]$ lua
Lua 5.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
> loadlib('helloworld.so', 'init')()
stdin:1: attempt to call a nil value
stack traceback:
     stdin:1: in main chunk
     [C]: ?
> 

これはlua binaryが~/binディレクトリの下に置かれているため、helloworld.soはそれと同じディレクトリにありません.loadlib関数はnilを返します.
soファイルのフルパスを直接説明すると、この問題を解決できます.
> loadlib('/home/zeli/code/luabind/helloworld.so', 'init')()
> greet()
hello world - my luabind try
> 

Initは、luaのC−API仕様に適合するsoに定義された関数である.
loadlibの後、luabindの関数/クラスを使用してlua vm環境に登録するには、この関数を直接実行する必要があります.
完了するとlua vmにgreet C関数があります.lua環境で直接実行できます.
これはlua=>C/C++の古典的な書き方です.
C/C++言語で作成された外部ライブラリの方法でluaの機能を拡張し、luaコードをC/C++の関数に呼び出すことができます.