一、环境搭建
先下载LuaForWindows并安装。 我的目录如下D:\Tool\Lua\5.1(这里使用的是5.1版本)
1 、启动VS2012,选择C++下的"win32"项目类型中的"Win2控制台应用程序"
2、工具——选项——项目和解决方案——VC++目录——可执行程序(D:\Tool\Lua\5.1);包含文件(D:\Tool\Lua\5.1\include);库文件(D:\Tool\Lua\5.1\lib);项目——'项目名'属性 子菜单——配置属性——链接器——输入——附加依赖项(lua51.lib lua5.1.lib)
先下载LuaForWindows并安装。 我的目录如下D:\Tool\Lua\5.1(这里使用的是5.1版本)
1 、启动VS2012,选择C++下的"win32"项目类型中的"Win2控制台应用程序"
2、工具——选项——项目和解决方案——VC++目录——可执行程序(D:\Tool\Lua\5.1);包含文件(D:\Tool\Lua\5.1\include);库文件(D:\Tool\Lua\5.1\lib);项目——'项目名'属性 子菜单——配置属性——链接器——输入——附加依赖项(lua51.lib lua5.1.lib)
上代码
// VsLuaTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
};
//#pragma comment(lib, "lua51.lib")
/*Lua解释器指针*/
lua_State* L;
int luaAdd(int x, int y)
{
int sum;
lua_getglobal(L, "add"); //查找lua_add函数,并压入栈底
lua_pushnumber(L, x); //参数入栈
lua_pushnumber(L, y);
lua_call(L, 2, 1);
sum = (int)lua_tonumber(L, -1); //从栈中取回返回值
return sum;
}
int _tmain(int argc, _TCHAR* argv[])
{
/*初始化Lua*/
L = lua_open(); ///* opens Lua,使用lua5.2版本则是luaL_newstate();
luaopen_base(L); /* opens the basic library 这些是在引入一些库,
就如如果add函数在编译成dll后如果在lua中要使用需要require “动态库名"一样*/
//library这些库是加在这里只是测试
/*
luaopen_table(L); // opens the table
luaopen_io(L); // opens the I/O library
luaopen_string(L); // opens the string lib.
luaopen_math(L); // opens the math lib.
*/
//luaL_openlibs(L); 加载Lua通用扩展库--如果不需要扩展则不用加
//lua_register(L,"add",luaAdd);//册add函数,但是5.1版本不行
luaL_dofile(L,"add.lua"); //加载lua文件,回将里面的函数加载到全局表中
//luaL_loadfile(L, "add.lua");//这里是不同版本的接口
//如果调用luaL_dofile 加载lua脚本文件,则不需要
//如果是调用luaL_loadfile加载,则需要在程序中调用一次lua_pcall(L, 0, 0, 0);
//lua_pcall(L, 0, LUA_MULTRET, 0);//
int sum = luaAdd(10, 15);
printf("the sum is = %d\n", sum);
//关闭lua环境
lua_close(L);
return 0;
}
头文件lua.h定义了lua提供的基础函数,包括创建lua环境、调用lua函数(如lua_pcall)、读写lua环境中全局变量,以及注册供lua调用的新函数等。Lua.h中定义所有内容都有一个lua_前缀。
头文件lauxlib.h定义了辅助库(auxiliary library,auxlib)提供的函数。它的所有定义都以luaL_开头(如luaL_loadbuffer)。辅助库是一个使用lua.h中API编写出的一个较高的抽象层。Lua的所有标准库编写都用到了辅助库。<p style="margin: 0px; padding: 0px; line-height: 26px; font-family: Arial; background-color: rgb(255, 255, 255);"><span style="color:#ff00;">注意</span>:Lua脚本的编译执行是相互独立的,在不同的线程上执 行。通过luaL_newstate()函数可以申请一个虚拟机,返回指针类型lua_State。今后其他所有Lua Api函数的调用都需要此指针作为第一参数,用来指定某个虚拟机。所以lua_State代表一个lua虚拟机对像,luaL_newstate()分配 一个虚拟机。lua类库管理着所有的虚拟机。销毁指定虚拟机的所有对像(如果有垃圾回收相关的无方法则会调用该方法)并收回所有由该虚拟机动态分配产生的 内存,在有些平台下我们不需要调用此函数,因为当主程序退出时,资源会被自然的释放掉,但是但一个长时间运行的程序,比如后台运行的web服务器,需要立 即回收虚拟机资源以避免内存过高占用。</p>