[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,就發現了自己版本的lua5.1 binary不支持loadlib函數
> print(loadlib())
解決辦法是在lua src/luaconf.h文件中,將LUA_COMPAT_LOADLIB激活,然後重新編譯lua binary

3. 編寫C++對LUA的擴展庫:
解決2之後,編寫如下的C++代碼:
#include <iostream>
#include <luabind/luabind.hpp>

void greet()
{
    std::cout << "hello world - my luabind try\n";
}

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腳本來生成(gcccmd.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是定義在so中的函數,符合lua的C-API規範。
在loadlib之後需要直接運行這個函數,才能將裏面藉助luabind的函數/類註冊到lua vm環境中。
完成之後,lua vm中便有了greet C函數。我們可以在lua環境中直接運行。
這是lua => C/C++的經典寫法,通過C/C++語言編寫的外部庫的方法來擴展lua的功能,從而讓lua 代碼可以調用到C/C++的函數。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章