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






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值