Lua与C++相互调用

{--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.