[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 
#include 

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++的函数。






你可能感兴趣的:(编程应用,lua语言)