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

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

工具:

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

  作用:此工具可以在windows环境下编译运行Lua脚本程序。安装完成后会有两个图标:LuaSciTELua是命令行,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

 

posted @ 2014-08-10 11:51  一个橙子~  阅读(1000)  评论(0编辑  收藏  举报