打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
用C语言扩展lua模块(入门)

lua中常常加载一些模块来实现某些功能。如果没有现成的模块以供require,那么我们只好自己写模块了。

  前几天用C给lua扩展了sha1算法模块。提炼出来做个笔记。

  lua示例代码如下:

require "libencode"local str = "source str"local des = libencode.sha1(str)print(des)

  我需要用libencode模块中的sha1()函数求出des。很简单,require该模块,然后直接调用。那么,这个库怎么来的呢?

  分为三步:首先用C写模块(遵循规则),再把源码编译成动态库,最后把动态库拷贝到相应目录下(必须是lua识别的目录)

  先贴出代码:

  

#include <lua.h>#include <lauxlib.h>#include <lualib.h>static void encode_sha(const char* src, char* des){    /*     *sha-hash  //hash算法     */}static int l_sha1(lua_State* lua){    const char *src = NULL;    char des[40] = {0};    src    = luaL_checkstring(lua, 1);    //出栈获取源字符串    encode_sha(src, des);               //something    lua_pushstring(lua, des);          //压栈返回给lua    return 1;                           //告诉lua返回了一个变量} //映射表,"sha1"为lua中的函数名,l_sha1为真正C中的函数地址static const struct luaL_Reg encode[] = {    {"sha1", l_sha1},    {NULL, NULL},}; //模块注册函数int luaopen_libencode(lua_State* lua){    //注册本模块中所有的功能函数,libencode为模块名,encode数组存储所有函数的映射关系    luaL_register(lua, "libencode", encode);    return 1;}

  encode[]数组中存储lua中各个函数名和函数实际地址。

  luaopen_xxx()函数负责注册模块。例如这里当lua执行require "libencode"指令时便会搜寻luaopen_libencode()函数注册模块。

  luaL_register()函数用给定名称创建一个table。并用数组内容填充table。也就是说这个函数把模块里所有的API函数注册到这个模块名下,这样就可以以(module.fun)这种格式在lua中访问C函数了。

  编译:

    gcc source.c -fPIC -shared -o source.so(如果lua时调用出错,根据情况加其他编译参数)

  拷贝:

    mv  .../source.so    LUA_C_PATH(这里要拷贝到lua的c模块路径,命令行下执行print("C path:", package.cpath)获得路径

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
lua-5.1 跟 lua-5.2 之间的一些差异
C模块回调Lua函数的两种方法(转)
hashlib模块使用详情
c++调用lua脚本1(平台windows)
luajit FFI LUA脚本中怎样调用C自己定义的函数
lua和c/c 互相调用实例分析 - lxyfirst - C 博客
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服