当用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