• 用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)获得路径

  • 相关阅读:
    Codeforces Round #614 (Div. 2) D. Aroma's Search
    Codeforces Round #614 (Div. 2) C. NEKO's Maze Game
    Kruskal最小生成树及应用
    Codeforces Round #608 (Div. 2) E. Common Number
    Codeforces Round #607 (Div. 2) D Beingawesomeism
    codeforce Hello 2020 A~E
    Codeforces Round #609 (Div. 2)
    Codeforces Round #607 (Div. 2) C. Cut and Paste
    Codeforces Round #605 (Div. 3) F. Two Bracket Sequences 三维dp
    2019-2020Nowcoder Girl初赛题解
  • 原文地址:https://www.cnblogs.com/acool/p/4920967.html
Copyright © 2020-2023  润新知