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

时间: 2024-10-12 17:05:15

用C语言扩展lua模块(入门)的相关文章

扩展Python模块系列(五)----异常和错误处理

在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_DECREF.在编写C语言代码时,需要了解Python提供的C/C++ API的实现细节,特别是有的API内部实现会调用Py_INCREF,这时自己编写的函数可能需要调用Py_DECREF,而有的API内部实现只是borrowed reference,此时一般不应该调用Py_DECREF. 本节讨论

Lua简易入门教程

环境:lua for windows (lfW)主页:http://luaforwindows.luaforge.net/https://code.google.com/p/luaforwindows/ lua for windows其实是一整套Lua的开发环境,它包括:Lua Interpreter(Lua解释器)Lua Reference Manual(Lua参考手册) Quick Lua Tour (Lua快速入门)Examples (Lua范例)Libraries with docume

ngx lua模块源码简单解析

ngx lua模块源码简单解析分类: nginx 2014-07-11 11:45 2097人阅读 评论(0) 收藏 举报nginxlua数据结构架构目录(?)[+]对nginx lua模块的整个流程,原理简单解析.由于nginx lua模块相关配置,指令,API非常多,所以本文档只以content_by_lua指令举例说明. 读本文档最好配合读源码. 不适合对nginx和lua一点都不了解的人看.1.相关配置详细配置见 https://github.com/openresty/lua-ngin

转:用C语言扩展Python的功能

转自:http://www.ibm.com/developerworks/cn/linux/l-pythc/ 一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中. 与其它普通脚本语言有所不同,Python程序员可以借助Python语言提供的API,使用C或者C++来对Python进行功能性扩展,从而即可以利用Python方便灵活

单片机脚本语言-移植lua到stm32-MDK

Lua简介 Lua[1]  是一个小巧的脚本语言.作者是巴西人.该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用.不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护. Lua的目标是成为一个很容易嵌入其它语言中使用的语言.大多数程序员也认为它的确做到了这一点. 很多应用程序使用LUA作为自己的嵌入式脚本

扩展Python模块系列(一)----开发环境配置

本系列将介绍如何用C/C++扩展Python模块,使用C语言编写Python模块,添加到Python中作为一个built-in模块.Python与C之间的交互目前有几种方案: 1. 原生的Python C/C++ API, 官网有非常详细的文档说明 2. boost python,一个C++的编程框架,对官方API进行了封装,可以方便的用C++扩展Python模块,省去了很多诸如引用计数的烦恼. http://www.boost.org/doc/libs/1_64_0/libs/python/d

FFLIB之FFLUA——C++嵌入Lua&amp;扩展Lua利器[转]

摘要: 在使用C++做服务器开发中,经常会使用到脚本技术,Lua是最优秀的嵌入式脚本之一.Lua的轻量.小巧.概念之简单,都使他变得越来越受欢迎.本人也使用过python做嵌入式脚本,二者各有特点,关于python之后会写相关的文章,python对于我而言更喜欢用来编写工具,我前边一些相关的算法也是用python来实现的.今天主要讲Lua相关的开发技术.Lua具有如下特点: Lua 拥有虚拟机的概念,而其全部用标准C实现,不依赖任何库即可编译安装,更令人欣喜的是,整个Lua 的实现代码并不算多,

生产环境上nginx 不覆盖添加lua模块

需求如下: 需要在nginx配置文件中判断请求中是否带某参数变量,nginx配置本身没有此判断功能. 网上查找资料,可以在nginx中添加lua模块,使用lua的脚本去判断.比较靠谱的文章:CentOS系统下,如何安装 nginx_lua_module 模块 以及 echo-nginx-module 模块 主要安装: lua-nginx-module-master ngx_devel_kit-master LuaJIT 三个模块,但找了一圈发现都是需要**重新编译nginx并且覆盖安装**. 再

【转】用C语言扩展Python的功能

原作者:肖文鹏 ([email protected]),原文地址:http://www.ibm.com/developerworks/cn/linux/l-pythc/ Pyton和C分别有着各自的优缺点,用Python开发程序速度快,可靠性高,并且有许多现成模块可供使用,但执行速度相对较慢:C语言则正好相反,其执行速度快,但开发效率低.为了充分利用两种语言各自的优点,比较好的做法是用Python开发整个软件框架,而用C语言实现其关键模块.本文介绍如何利用C语言来扩展Python的功能,并辅以具