Lua利用一个虚拟的栈(stack)来给C传递值或从C获取值。每当Lua调用C函数,都会获得一个新的栈,该栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回值压入这个栈(Lua从中拿到C函数调用结果)
本文展示了如何在lua中调用c函数的一种方法:通过将c函数编译成库文件(如Linux的.so),成为Lua的模块
luaclib.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <lauxlib.h> #include <lualib.h> #include <stdio.h> #include <string.h> static int (lua_State* L) { double op1 = luaL_checknumber(L,1); double op2 = luaL_checknumber(L,2); lua_pushnumber(L, op1 + op2); printf("test add!!!rn"); return 1; } static int lua_sub(lua_State* L) { double op1 = luaL_checknumber(L,1); double op2 = luaL_checknumber(L,2); lua_pushnumber(L, op1 - op2); printf("test sub!!!rn"); return 1; } static const struct luaL_Reg libt_reg[] = { {"add", lua_add}, {"sub", lua_sub}, {NULL,NULL} }; int luaopen_testlibs_libtt(lua_State *L) { luaL_register(L, "ct", libt_reg); return 1; }
|
lua中如何调用:
1 2 3 4 5
| require "testlibs.libtt" print(ct.add(1,2)) local c = require "testlibs.libtt" print(c.sub(7,3))
|
参考:https://www.cnblogs.com/sifenkesi/p/3876745.html
http://www.lua.org/pil/26.2.htm