第一步(环境准备工作):
工具:
●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
|
请发表评论