{--1、环境--}
为了快速入手,使用了小巧快速的vc++6.0编译器
以及在官网下载了Lua安装包..官网地址{--http://10.21.210.18/seeyon/index.jsp--}
两者都安装好后,即可进行
{--2、工程以及配置--}
1、首先用vc++6.0创建一个简单的win32 console application
2、从Lua的安装目录下复制include和lib两个目录下的文件到刚刚创建的工程的目录下。
{include:包含了lua的.h头文件}
{lib:包含了lua的动态链接库dll}
3、为了使vc++6.0编译和链接时能找到所需的Lua文件
{在工程下添加刚刚复制过来的所有.h文件,保证编译通过}
{在编译器里面设置dll{工程-设置-对象/库模块 那一行的最后添加 lua5.1.lib lua51.lib,保证链接时通过}}
{--3、C++与Lua相互调用例子--}
要调用Lua,首先我们得写一个简单的Lua文件,并把该文件保存到一个路径下,这里比如路径是{F:\\Lua}
function add(x, y) n1, n2 = clib();//关于clib()是一个C函数,稍后会介绍到。 print("The first arg"..n1); print("The second arg"..n2); return x + y end
该函数用于计算从C函数传递过来的的两个参数x,y的和。
另外为了方便,这函数里面同时也演示了如何调用Lua如何调用C函数clib()
接下来我们开始编写主函数
#include<stdlib.h>
// 这是个C++程序, 所以要extern "C",
// 因为lua的头文件都是C格式的
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
lua_State* L; /* the Lua interpreter */
//给lua调用的c函数必须定义成static int XXX(lua_State *L)
static int clib(lua_State *L)
{
lua_pushnumber(L, 100);
lua_pushnumber(L, 200);
return 2;
//lua调用该函数将从栈中,取2个结果
}
//此处C++调用了Lua函数
int luaadd (int x, int y)
{
int sum;
/* the function name */
lua_getglobal(L, "add");
/* the first argument */
lua_pushnumber(L, x);
/* the second argument */
lua_pushnumber(L, y);
/* call the function with 2 arguments, return 1 result */
//说明调用的函数是带有2个参数和1个返回值
lua_call(L, 2, 1);
/* get the result */
sum = (int)lua_tonumber(L, -1);
lua_pop(L, 1);
return sum;
}
int main(int argc, char* argv[])
{
int sum;
/* initialize Lua */
L = luaL_newstate();//创建一个指向lua解释器的指针
/* load Lua base libraries */
luaL_openlibs(L);
lua_register(L, "clib", clib);
/* load the script */
/*Lcc.lua是这个C++程序调用的Lua文件,
注意luaL_dofile()函数的第二个参数要写绝对路径,否则执行后会提示
“unprotected error in call to lua api(attampt to call a nil value)”错误 */
luaL_dofile(L, "F:\\lua\\Lcc.lua");
/* call the add function */
sum = luaadd(10, 15);
/* print the result */
printf( "The sum is %d\n", sum );
/* cleanup Lua */
lua_close(L);
system("pause");
return 0;
}
以上的clib()函数就是Lua文件里面要调用的函数
关键代码:lua_register(L, "clib", clib);将函数注册到Lua栈中,使得Lua可以调用到。
而C++如何调用Lua
关键代码:luaL_dofile()以及luaadd()函数
-------------------------------------------------------------------------------------
By Alwaystiys..
From 2014.09.05
At Gz.