Lua调用C函数C调用Lua函数现在lua调用c已经掌握(就是调用c编写的动态库),但是C调用lua还不是到怎么实现。要深究1.Lua中调用C函数例子:(1)#lib.c#includestdio.h#includelua.h#includelauxlib.h#includelualib.h--在这个例子中这个头文件可以不要staticintlua_c_hello(){printf(cfunction\n);return1;}staticconststructluaL_regmylib[]={{hello,lua_c_hello},{NULL,NULL}};intluaopen_mylib(lua_State*L){luaL_openlib(L,mylib,mylib,0);//luaL_register(L,mlib,mylib);return1;}(2)生成动态库:gcc-shared-fPIC-omylib.so./lib.c注意:这里生成的动态库名(mylib),必须lib.c代码尾中的intluaopen_mylib(luaState*L)一致。急lib.c中要定一个打开生成动态库的函数,即要保证两者的名称一致(3)#loadlualib.luafunctionopenmylib()localf=assert(loadlib(/whc/work/mylib.so,mylib))f()endopenmylib();(4)#usermylib.luarequire(loadlualib)mylib.hello()(5).第三和第四步可以合并在一起:#test.lualocalpprint=requirepprintlocalmlib=require'mylib'print(mlib.hello())输出:cfunctionfunction:0xc75ed02.C中调用Lua函数(1).在c中调用lua函数,获取返回值等分类:lua2013-11-1313:462046人阅读评论(0)收藏举报我们这次主要说说怎么由Lua定义函数,然后在C或者C++中调用.这里我们暂不涉及C++的对象问题,只讨论调用函数的参数,返回值和全局变量的使用.2.这里我们在e12.lua里先定义一个简单的add(),x,y为加法的两个参数,return直接返回相加后的结果.例e12.lua--addtwonumbersfunctionadd(x,y)returnx+yend在前一次里,偶们说到lua_dofile()可以直接在C中执行lua文件.因为偶们这个程序里只定义了一个add()函数,所以程序执行后并不直接结果,效果相当于在C中定义了一个函数一样.Lua的函数可以有多个参数,也可以有多个返回值,这都是由栈(stack)实现的.需要调用一个函数时,就把这个函数压入栈,然后顺序压入所有参数,然后用lua_call()调用这个函数.函数返回后,返回值也是存放在栈中.这个过程和汇编执行函数调用的过程是一样的.例e13.cpp是一个调用上面的Lua函数的例子#includeexternC{//这是个C++程序,所以要externC,//因为lua的头文件都是C格式的#includelua.h#includelualib.h#includelauxlib.h}/*theLuainterpreter*/lua_State*L;intluaadd(intx,inty){intsum;/*thefunctionname*/lua_getglobal(L,add);/*thefirstargument*/lua_pushnumber(L,x);/*thesecondargument*/lua_pushnumber(L,y);/*callthefunctionwith2arguments,return1result*/lua_call(L,2,1);/*gettheresult*/sum=(int)lua_tonumber(L,-1);lua_pop(L,1);returnsum;}intmain(intargc,char*argv[]){intsum;/*initializeLua*/L=lua_open();/*loadLuabaselibraries*/lua_baselibopen(L);/*loadthescript*/lua_dofile(L,e12.lua);/*calltheaddfunction*/sum=luaadd(10,15);/*printtheresult*/printf(Thesumis%d\n,sum);/*cleanupLua*/lua_close(L);return0;}程序说明:main中过程偶们上次已经说过了,所以这次只说说luaadd的过程*首先用lua_getglobal()把add函数压栈*然后用lua_pushnumber()依次把x,y压栈*然后调用lua_call(),并且告诉程序偶们有两个参数一个返回值*接着偶们从栈顶取回返回值,用lua_tonumber()*最后偶们用lua_pop()把返回值清掉运行结果:Thesumis25编译方法Linux下把程序存成e13.cppg++e13.cpp-llua-llualib-oe13./e13VC下编译方法*首先建立一个空的Win32ConsoleApplicationProject*把e13.cpp加入工程中*点projectsetting,然后设置link选项,再加上lua.liblualib.lib两个额外的库*最后编译建立好的project可以在这里下载VC://tonyandpaige.com/tutorials/luaadd.tar.gz3.全局变量上面偶们用到了lua_getglobal()但并没有详细讲,这里偶们再举两个小例子来说下全局变量lua_getglobal()的作用就是把lua中全局变量的值压入栈lua_getglobal(L,z);z=(int)lua_tonumber(L,-1);(ps:将栈顶元素转为int)lua_pop(L,1);假设Lua程序中定义了一个全局变量z,这段小程序就是把z的值取出放入C的变量z中.另外Lua中还有一个对应的函数lua_setglobal(),作用是用栈顶的值填充指定的全局变量lua_pushnumber(L,10);(ps:pushnumber往栈中推进一个变量,使用setglobal设置lua中全局变量z)lua_setglobal(L,z);例如这段小程序就是把lua中的全局变量z设为10,如果lua中未定义z的话,就会自动创建一个全局变量z并设为10.4.试试看自己写个函数用C/C++来调用下试试===================================================================ps:lua函数只有一个返回值的情况:假设返回值的类型是整型,用lua_tonumber获取返回值:z=lua_tonumber(L,-1);--这里的-1表示栈顶然后清栈:lua_pop(L,1);/*popreturnedvalue*/lua函数有多个返回值的情况:LUA_APIint(lua_pcall)(lua_State*L,intnargs,intnresults,interrfunc)函数中有一个指定返回值个数的,你需要指定,比如:lua_pcall(lua,2,3,0)表示两个输入参数,3个返回值。如果有多个返回值,第一个返回值会先压栈。例如有三个返回值,第一个在栈中的索引是-3,最后一个-1。z1=lua_tonumber(L,-3);z2=lua_tonumber(L,-2);z3=lua_tonumber(L,-1);