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

工具:

●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

C++中嵌入Lua脚本环境搭建的更多相关文章

  1. redis中使用lua脚本

    lua脚本 Lua是一个高效的轻量级脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能 使用脚本的好处 1.减少网络开销,在Lua脚 ...

  2. nginx 与 lua 开发环境搭建

    首先下载最新版的 相关软件 的安装文件. nginx: http://nginx.org/en/download.html LuaJIT: http://luajit.org/download.htm ...

  3. 怎样在Cocos2d-x中使用Lua脚本

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013321328/article/details/25699545 笔者使用的是Cocos2d-x ...

  4. C++调用Lua编程环境搭建及测试代码示例

    C++调用Lua编程环境搭建及测试代码示例 摘要:测试环境是VS2005+LuaForWindows_v5.1.4-45.exe+WIN7 1.安装lua开发环境LuaForWindows_v5.1. ...

  5. Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性

    Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...

  6. eclipse中SSH三大框架环境搭建<三>

    相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的 ...

  7. eclipse中SSH三大框架环境搭建<二>

    通过上一篇博客我们可以轻松搭建strtus2的环境,接下来由我来继续介绍spring的环境搭建以及spring注入的简单使用 相关链接:eclipse中SSH三大k框架环境搭建<一> ec ...

  8. eclipse中SSH三大框架环境搭建<一>

    这里先简单介绍一下我用的三大框架版本以及下载地址 相关链接:eclipse中SSH三大框架环境搭建<二> eclipse中SSH三大框架环境搭建<三> struts-2.3.3 ...

  9. 在redis中使用lua脚本

    在实际工作过程中,可以使用lua脚本来解决一些需要保证原子性的问题,而且lua脚本可以缓存在redis服务器上,势必会增加性能. 不过lua也会有很多限制,在使用的时候要注意. 在Redis中执行Lu ...

随机推荐

  1. python 类型判断-- isinstance函数

    判断类型 函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str.list.dict,也可以用在我们自定义的类,它们本质上都是数据类型. 假设有如下的 Per ...

  2. js整理1

    数组 比较时的隐式转化 var a = [1,2,3]; var b = [1,2,3]; a == b; //false a == '1,2,3'; //true; // var c = []; B ...

  3. 为什么网页通常把JS调用放在底部?

    JS是单线程,浏览器是多线程.当我们在浏览器的地址栏里输入一个url地址,访问新页面时,页面展示的快慢是由一个单线程控制,这个线程叫做UI线程.UI线程会根据页面里资源(资源是html文件.图片.cs ...

  4. 手持终端PDA应用固定资产管理系统(资产查询 盘点)软件程序系统

    一.产品概述 固定资产管理系统,是针对企事业单位内部资产管理中出现的工作量大.过程繁琐.追踪困难等一系列难题开发的一套先进管理软件.软件实现了对资产的多种方式管理,目前包括条形码.二维码.RFID管理 ...

  5. 移动终端app测试点总结

    以下所有测试最后必须在真机上完整的执行1.安装.卸载测试 在真机上的以及通过91等第三方的安装与卸载 安装在手机上还是sd卡上 2.启动app测试3.升级测试 数字签名.升级覆盖安装.下载后手动覆盖安 ...

  6. spring.net tx:advice 和 aop:config 配置事务 匹配名字的方法管理事务

    在网上找到的都是java里的配置方式,后来认真读了下spring.net的帮助文档,解决了这个问题:现在把我的server层的配置文件copy出来: <?xml version="1. ...

  7. 我的c++学习(5)switch语句详解

    #include "stdafx.h" #include<iostream> using namespace std; #include<iomanip> ...

  8. BestCoder Round #66 (div.2)

    构造 1002 GTW likes gt 题意:中文题面 分析:照着题解做的,我们可以倒着做,记一下最大值,如果遇到了修改操作,就把最大值减1,然后判断一下这个人会不会被消灭掉,然后再更新一下最大值. ...

  9. JavaScript 参考手册——javascript本地和内置对象、BOM、DOM

    本部分提供完整的 JavaScript 参考手册: JavaScript 本地对象和内置对象 Browser 对象(BOM) HTML DOM 对象 JavaScript 对象参考手册 本参考手册描述 ...

  10. oracle查看表实际物理空间使用大小

    http://www.2cto.com/database/201107/95313.html 一种是分配给一个表的物理空间数量,而不管空间是否被使用.可以这样查询获得字节数:select segmen ...