C语言和Lua交互(七)

25 篇文章 9 订阅

为Lua写一个C模块

当用C函数扩展Lua时,最好就是将代码设计为一个C模块。

直接上代码:

#include <math.h>
#include <stdio.h>
#include <string.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

//待注册的C函数,和上一节相同
static int myadd(lua_State* L)
{
    double op1 = luaL_checknumber(L,1);
    double op2 = luaL_checknumber(L,2);
    lua_pushnumber(L,op1 + op2);

    return 1;
}

static int mysin(lua_State *L){
    double d = luaL_checknumber(L, 1);
    lua_pushnumber(L, sin(d));
    return 1;
}

//luaL_Reg结构体
//最后一个元素的两个字段均为NULL,表示Lua注册函数已经到达数组的末尾。
static const struct luaL_Reg mylib[] = {
    {"myadd" , myadd},//第一个字段为字符串,在注册时用于通知Lua该函数的名字。
    {"mysin" , mysin},
    {NULL, NULL}
};

//导出函数库
//函数名必须为luaopen_xxx,其中xxx表示library名称。Lua代码require "xxx"对应。
int luaopen_mylib(lua_State *L){
    luaL_newlib(L, mylib);
    //luaL_register(L, "mylib",mylib); // lua 5.1
    return 1;
}

编译代码,生成动态链接库(Linux的so,或Windows的DLL)

gcc mylib.c -fPIC -shared -o mylib.so

将包生成库文件,拷贝到Lua代码所在的当前目录,或者是LUA_CPATH环境变量所指向的目录,以便于Lua解析器可以正确定位到他们。

在mylib.so同目录新增文件test.lua

local mylib = require("mylib")
local sin = mylib.mysin(2);
local num = mylib.myadd(123,44)
print(sin)
print(num)

运行lua代码

lua test.lua
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值