一、模块
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
#include
#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
#include
#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