Lua从编译到使用
一、Lua的源码下载和编译:
1. 源码准备:
1) 请上lua的网站下载lua-5.1.4.tar.gz 网址http://www.lua.org/download.htmlg
2) 解压lua-5.1.4.tar到目录下有Src目录为代码目录
2. 静态库编译使用
1) 用VC6.0新建立一个工程:win32 static library
2) 把Src下的文件全放到工程目录下编译运行,会在工程目录的debug中产生一个对应工程名字的.lib文件,这就成功编译出了静态库
3) 以后其它lua项目要使用时就可以把.lib拷贝出来,在对应工程中的setting中的link->input->object/library modules中加入对应的XXX.lib
4) 同进在link->input->addition library path:中加入.lib所在文件的相对位置
5) 在使用时注意在.h文字中加入这些头文件你的工程就可以使用lua的静态库了
extern "C"{
#include "../Lua5_1_4/Lua_Src_514/lua.h"
#include "../Lua5_1_4/Lua_Src_514/lualib.h"
#include "../Lua5_1_4/Lua_Src_514/lauxlib.h"
}
3. 动态库编译使用
1) 用VC6.0新建立一个工程:win32 Dynamic-Link Library,创建空的动态库
2) 反lua-5.1.4下的Src下的文件全放到工程目录下并删除lua.c,luac.c和print.clua.c,luac.c和print.c这几个文件不然会有重复引用的错误提示
3) 编译运行完以后会在工程目录debug中产生一个对应工程名字的.dll,这就编译出了动态库。
4) 具体动态库的调用我就不在这里述说了
二、C/C++对Lua的调用 以主 lua对C/C++的调用
extern "C"{
#include "../Lua5_1_4/Lua_Src_514/lua.h"
#include "../Lua5_1_4/Lua_Src_514/lualib.h"
#include "../Lua5_1_4/Lua_Src_514/lauxlib.h"
}
lua_State * L; //lua的全局对象
int luaadd ( int x, int y )
{
int sum;
//函数名
lua_getglobal(L, "add");
//第一个参数压栈
lua_pushnumber(L, x); /
//第二个参数压栈
lua_pushnumber(L, y);
//调用函数
lua_call(L, 2, 1);
//得到返回值
sum = (int)lua_tonumber(L, -1);
lua_pop(L, 1);
return sum;
}
static int average(lua_State *L)
{
int n = lua_gettop(L); //lua_gettop()的作用是返回栈顶元素的序号.
double sum = 0;
int i;
for (i = 1; i <= n; i++)
{
sum += lua_tonumber(L, i);
}
lua_pushnumber(L, sum / n);
lua_pushnumber(L, sum);// 然后偶们用lua_pushnumber()把平均值和总和push到栈中
return 2;//最后, 偶们返回2, 表示有两个返回值
}
int main ( int argc, char *argv[] )
{
int sum;
//创建一个指向Lua解释器的指针。
L = lua_open();
//函数加载Lua库
luaL_openlibs(L);
//加载脚本
int error = luaL_dofile(L,"add.lua");
//调用函数
sum = luaadd( 10, 11);
// print the result
printf( "The sum is %d/n", sum );
//关闭 释放资源
lua_close(L);
return 0;
}
Add.lua的编写
function add(x, y)
avg,sum=average(10,20)
return sum
end;
lua_state *L;
lua_open();
lua_openLibs(L);
luaL_doFile(L, “filename”);
lua_getgloble(L,”functionname”)
lua_pushnumber(L, 1);
lua_call(L,输入参数个数,输出参数);
lua_tonumber(L, -1);得到第一个返回值
lua_pop(L,1);
lua_gettop(L);返回参数个数