为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