Lua:模块、使用位操作BitOp、C API(Lua与C互相调用)

一、模块

1.1 概述

创建一个模块最简单的方法是:

        1. 创建一个table;

        2. 并将所有需要导出的函数放入其中;

        3. 最后返回这个table。

1.2 代码

文件:test.lua

complex = {}

function complex.add(x, y)
        return x+y
end

return complex

1.2 运行结果

加载模块:require (“test”)


二、使用位做操

1.1 Lua位操作

        Lua不支持位操作,需要单独下载位操作的模块BitOp。

1.2 下载、安装位操作模块

下载:

        文件名:LuaBitOp-1.0.2.tar.gz

        下载地址:http://bitop.luajit.org/download.html

安装:

        tar zxvf LuaBitOp-1.0.2.tar.gz

        cd LuaBitOp-1.0.2

        make  (可能需要修改bit.c中包含的lua.h文件的路径)

        make install

1.3 使用位操作

加载模块:require (“bit”)


三、Lua调用C函数

3.1 代码:将C函数写成模块

#include <stdio.h>
#include <string.h>
#include "/root/LuaJIT-2.0.2/src/lua.h"
#include "/root/LuaJIT-2.0.2/src/lauxlib.h"
#include "/root/LuaJIT-2.0.2/src/lualib.h"

static int c_add(lua_State* L)
{
    //1. 检查栈中的参数是否合法,1表示Lua调用时的第一个参数(从左到右),依次类推。
    //1. 如果Lua代码在调用时传递的参数不为number,该函数报错并终止程序运行。
    double op1 = luaL_checknumber(L,1);
    double op2 = luaL_checknumber(L,2);

    //2. 将函数的结果压入栈中。
    //2. 如果有多个返回值,可以在这里多次压入栈。
    lua_pushnumber(L,op1 + op2);

    //3. 返回值用于提示该C函数的返回值数量,即压入栈中的返回值数量
    return 1;
}

static const struct luaL_Reg test[] = {
    {"add", c_add},
    {NULL, NULL}
};

//声明一个主函数
LUALIB_API int luaopen_test(lua_State* L)
{
    luaL_register(L,"test",test);
    return 1;
}

3.2 编译

        写完C模块后,必须将其链接到解释器。

        必须将C代码编译成动态链接库。

将C代码编译成动态库:

        gcc -fPIC -O2 -fomit-frame-pointer -Wall  -I/usr/local/include  -c -o test.o test.c

        gcc -shared -fPIC  -o test.so test.o

将动态库拷贝到Lua的lib目录下:

        cp test.so /usr/lib64/lua/5.1/

3.3 Lua中调用C函数

和调用Lua模块中函数一样:require ("test")


四、C调用Lua函数

4.1 代码

两个公共:

        lua作为配置文件,被C读取;

        lua中有lua函数,被C调用执行。

配置文件:data.lua

width = 200
height = 300


add = function (x, y)
        return x + y
end

代码文件:test.c

#include <stdio.h>
#include <stdlib.h>

#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

int add(lua_State *L, int x, int y)
{
        lua_getglobal(L, "add");
        lua_pushnumber(L, x);
        lua_pushnumber(L, y);

        if (lua_pcall(L, 2, 1, 0) != 0)
        {
                error(L, "error running function 'add':%s\n", lua_tostring(L, -1));
        }

        if (!lua_isnumber(L, -1))
        {
                error(L, "function 'add' must return a number.\n");
        }

        int z = lua_tonumber(L, -1);

        lua_pop(L, 1);

        return z;
}

int main(int argc, char*argv[])
{
        lua_State *L = luaL_newstate();
        luaL_openlibs(L);

        //0. load lua config
        if (luaL_loadfile(L, "/root/1103/data.lua") || lua_pcall(L, 0, 0, 0))
                error(L, "cann't:%s", lua_tostring(L, -1));

        //1. read lua variable
        lua_getglobal(L, "width");
        lua_getglobal(L, "height");

        if (!lua_isnumber(L, -2))
                error(L, "'width' should be a number.");
        if (!lua_isnumber(L, -1))
                error(L, "'height' should be a number.");

        int w = lua_tointeger(L, -2);
        int h = lua_tointeger(L, -1);

        printf("width:%d, height:%d\n", w, h);

        //2. read and run lua function
        int sum = add(L, 10, 4);

        printf("sum:%d\n", sum);

        lua_close(L);

        return 0;
}

4.2 编译

        gcc -o test test.c -I /usr/local/luajit/include/luajit-2.1 -L /usr/local/luajit/lib -l luajit-5.1

4.3 运行结果



参考资料:

        Step By Step(Lua调用C函数):http://www.cnblogs.com/stephen-liu74/archive/2012/07/23/2469902.html

        Lua和C函数互相调用的例子:http://blog.csdn.net/wallwind/article/details/8190364

        C中调用Lua函数:http://www.cnblogs.com/sifenkesi/p/3873720.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值