[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++コードを作成します.
その後gccコンパイル:
次のコンパイルオプションを
shellスクリプトを生成します(gccmd.sh+x):
これにより、多くの文字を叩くことができます.
現在のディレクトリの下にhelloworldがあります.soファイル生成.さらにldd/nmでhelloworldを見ることができますsoファイルには何が含まれていますか.
4.LUAでC++のコードを呼び出します.
luabindディレクトリでlua binaryを直接実行すると、loadlibは次のエラーに気づきます.
これはlua binaryが~/binディレクトリの下に置かれているため、helloworld.soはそれと同じディレクトリにありません.loadlib関数はnilを返します.
soファイルのフルパスを直接説明すると、この問題を解決できます.
Initは、luaのC−API仕様に適合するsoに定義された関数である.
loadlibの後、luabindの関数/クラスを使用してlua vm環境に登録するには、この関数を直接実行する必要があります.
完了するとlua vmにgreet C関数があります.lua環境で直接実行できます.
これはlua=>C/C++の古典的な書き方です.
C/C++言語で作成された外部ライブラリの方法でluaの機能を拡張し、luaコードをC/C++の関数に呼び出すことができます.
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++の関数に呼び出すことができます.