[Happy Coding] luabind 0.9.1版本尝试

来源:互联网 发布:python环境搭建 编辑:程序博客网 时间:2024/04/30 20:11
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]$ luaLua 5.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio> loadlib('helloworld.so', 'init')()stdin:1: attempt to call a nil valuestack 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++的函数。






0 0
原创粉丝点击