C++中嵌入Lua脚本环境搭建

第一步(环境准备工作):

工具:

●LuaForWindows_v5.1.4-46.exe傻瓜式安装。

作用:此工具可以在windows环境下编译运行Lua脚本程序。安装完成后会有两个图标:Lua和SciTE。Lua是命令行,SciTE是图形运行环境,两个都可以编译运行,看个人喜好。

●VS2012大家都会,此处省略若干字...

第二步(在VS2012下新建并运行C++中嵌入Lua脚本程序):

●打开VS2012,新建一个控制台的C++空项目

●配置Lua的安装路径和引用相关Lua库

1、右击新创建的工程,属性-->配置属性-->VC++目录:

可执行文件目录:C:\Program Files (x86)\Lua\5.1(LuaForWindows安装目录)

包含目录:C:\Program Files (x86)\Lua\5.1\include

库目录:C:\Program Files (x86)\Lua\5.1\lib

2、右击新创建的工程,属性-->配置属性-->链接器:所有选项

附加依赖项:lua51.lib lua5.1.lib(将此两项导入进去)(如果编译出错直接填写路径)

#pragma comment(lib,"lua5.1.lib" ) 这一步可以换成在代码中加入这个

第三步(万事俱备,只欠东风):

●在你的空项目中,新建一个.cpp源文件,编写测试代码。下面提供一个例子供新手测试。

●因为本人还不太熟悉Lua脚本的语法,更不会在C++中使用Lua啦,这里直接从网上借用了一下别人的,程序如下:

#include "stdafx.h"

#include <iostream>

#include <stdio.h>

#include <string>

using namespace std;

extern "C"

{

#include "lua.h"

#include "lualib.h"

#include "lauxlib.h"

}

lua_State *L;

double fun( double x, double y )

{

double ret;

lua_getglobal( L, "add"); // 获取全局变量f

lua_pushnumber( L,x); // 操作数压栈

lua_pushnumber( L,y); // 操作数压栈

lua_call( L, 2, 1); // 执行:2个操作数,1个返回值

//lua_pcall( L, 2, 1, 0); // 保护模式的lua_call,0为错误处理码。具体应用暂时不明,在使用手册中有粗略介绍

ret = lua_tonumber( L, -1); // 将栈顶元素转换成数字并赋值给ret

lua_pop( L, 1); // 从栈中弹出一个元素

return ret;

}

static int average(lua_State *L2)

{

/**//* get number of arguments */

int n = lua_gettop(L2);

double sum = 0;

int i;

/**//* loop through each argument */

for (i = 1; i <= n; i++)

{

/**//* total the arguments */

sum += lua_tonumber(L2, i);

}

lua_pushnumber(L, sum / n);

/**//* push the sum */

lua_pushnumber(L, sum);

/**//* return the number of results */

printf("average called. [ok]\n");

return 2;

}

int _tmain(int argc, _TCHAR* argv[])

{

int error;

L = lua_open(); // 创建Lua接口指针(借用DX的术语,本质是个堆栈指针)

luaopen_base(L); // 加载Lua基本库

luaL_openlibs(L); // 加载Lua通用扩展库

lua_register(L, "average", average);

error = luaL_dofile(L, "hellow.lua"); // 读取Lua源文件到内存编译

double ret = fun( 10, 3.4); // 调用模版函数f

printf( "ret = %f\n", ret); // 输出结果,C语言的东西,跟Lua无关

lua_close( L);

int a ;

cin>>a;

return 0;

}

hellow.lua 文件(放在main.cpp 同级目录)

function add ( x, y)

file = assert(io.open("data.txt", "w"))

file:write("abcde\n")

file:write("ok!\n")

file:close()

--DataDumper(1,2,3,4)

file = assert(io.open("data.txt", "r"))

str = file:read("*a")

io.write(str)

io.write("\n")

avg, sum = average(10, 200, 3000)

print("The average is ", avg)

print("The sum is ", sum)

return x + y

end

#include "stdafx.h"

#include <process.h>

extern "C" {

#include "lua.h"

#include <lauxlib.h>

#include <lualib.h>

}

#pragma comment(lib,"lua5.1.lib")

int main (void)

{

lua_State *L = lua_open(); /* 打开 Lua */

luaL_openlibs(L); /* 加载 .lib 文件 */

// 加载脚本文件,需要放在程序目录

luaL_loadfile( L, "test.lua" );

lua_resume( L, 0 );

// 调用【ShowIm】函数

lua_getglobal( L, "ShowIm" );

if( lua_resume( L, 0 ) )

printf( "%s/n", lua_tostring( L, 1 ) );

// 调用结束

lua_close(L);

system("pause");

return 0;

}

function ShowIm()

print( "\tHello , I'm Sollyu . \n\tI like this code ." )

end