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
C++中嵌入Lua脚本环境搭建的更多相关文章
- redis中使用lua脚本
lua脚本 Lua是一个高效的轻量级脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能 使用脚本的好处 1.减少网络开销,在Lua脚 ...
- nginx 与 lua 开发环境搭建
首先下载最新版的 相关软件 的安装文件. nginx: http://nginx.org/en/download.html LuaJIT: http://luajit.org/download.htm ...
- 怎样在Cocos2d-x中使用Lua脚本
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013321328/article/details/25699545 笔者使用的是Cocos2d-x ...
- C++调用Lua编程环境搭建及测试代码示例
C++调用Lua编程环境搭建及测试代码示例 摘要:测试环境是VS2005+LuaForWindows_v5.1.4-45.exe+WIN7 1.安装lua开发环境LuaForWindows_v5.1. ...
- Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性
Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...
- eclipse中SSH三大框架环境搭建<三>
相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的 ...
- eclipse中SSH三大框架环境搭建<二>
通过上一篇博客我们可以轻松搭建strtus2的环境,接下来由我来继续介绍spring的环境搭建以及spring注入的简单使用 相关链接:eclipse中SSH三大k框架环境搭建<一> ec ...
- eclipse中SSH三大框架环境搭建<一>
这里先简单介绍一下我用的三大框架版本以及下载地址 相关链接:eclipse中SSH三大框架环境搭建<二> eclipse中SSH三大框架环境搭建<三> struts-2.3.3 ...
- 在redis中使用lua脚本
在实际工作过程中,可以使用lua脚本来解决一些需要保证原子性的问题,而且lua脚本可以缓存在redis服务器上,势必会增加性能. 不过lua也会有很多限制,在使用的时候要注意. 在Redis中执行Lu ...
随机推荐
- BurpSuite抓App数据包的方法
软件准备: 1.猎豹wifi 2.BurpSuite或者fillder都可以 查看电脑IP地址: 网卡ip: 确保无线网卡的IP和手机的代理IP保持一致即可
- LoadRunner中截取字符串
LoadRunner中截取字符串 /*strchr和strrchr的区别*/ char *strTest1="citms citms"; char *strTest2,*strTe ...
- C语言连接SQLSERVER数据库
第一步:配置ODBC.在配置ODBC时有用户DSN.系统DSN.和文件DSN三种方法,为了稳妥起见,采用系统DSN. DSN的名字叫LocalServer,帐号:sa,密码123456 第二步:打开V ...
- Angular JS 学习之服务(Service)
1.AngularJS中,可以创建自己的服务,或使用内建服务: 2.在AngularJS中,服务是一个函数或对象,可在你的AngularJS应用中使用: AngularJS内建了30多个服务:有个$l ...
- 简单的实现UIpicker上面的取消确定按钮
1 因为我用的xib实现的添加picker 和textfiled的, @interface ViewController : UIViewController<UITextFieldDelega ...
- jenkins+ant+jmeter搭建持续集成的接口测试平台
一.jemter接口脚本的编写步骤如下: 1. 编写接口请求 通过录制或者查看接口文档,编写接口请求,进行调试,确保接口调试通过,对于http的请求来说,就是正确的填写域名,查询字符串,查询参数等信息 ...
- BZOJ4662 : Snow
首先离散化,即相邻关键点之间的部分可以压成一段. 注意到区间互不包含,因此排序后每个位置的清理影响到的是一段连续区间的清理工的工作长度. 这显然可以用线段树维护,支持区间减去一个数,单点加上$inf$ ...
- spring aop两种配置方式(1)
第一种:注解配置AOP注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before ...
- js 的try catch应用
<script language="javascript"> try { throw new Error(10,"asdasdasd") } cat ...
- 使用for( var each in record){} 去寻找object里面的内容;
for(var each in object){ alert(each); }