Lua与C++交互初探之C++调用Lua
Lua与C++交互初探之C++调用Lua
自从学习了lua这个脚本语言之后,无时不想着将他与c/c++联系起来,看看他真正的威力。奈何水平有限,网上找的代码无论怎样都无法运行成功。我知道是我少了某一步但是又不知道到底少了什么,于是就在各大博客、网站、论坛不断的摸索测试。我也不知道花了多长时间。总之在今天测试成功了。我把我测试遇到的问题和解决过程贴出来供大家参考。
一、lua环境的搭建
建议去网上下载luaforwindow,这是一款跟众多window系统的软件一样,安装起来简单方便,一路点next就能搞定了。而且他还包含了有用的与lua有关的基本工具
他包括以下组件:

Lua(Command Line):lua的一个命令行编辑器。简单轻便,习惯命令行编(zhuang)辑(bi)的可以试试。
Lua Examples: 包含lua使用的一些例子。
LuaForWindows Documentation :LuaForWindows这款软件的一些说明
QuickLuaTour : lua快速入门向导,没什么用,看看就好
SciTE:lua的一个不错的文本编辑器。可以在里面测试一些lua代码,可以运行测试。前提是要先保存文件在运行,否则他没有任何反应。别问我是怎么知道的,心塞塞
Documentation:里面包含lua的帮助文档,最有用的就是他了吧。
安装好后Lua的环境就算是搭建好了。我们用命令行简单来测试一下:

Ok,木有问题
二、VS环境配置
这一步是最重要的,一开始我是去lua官网下载的源文件再把他们添加到vs项目,虽然编译是没有问题了,但是在测试运行的时候链接还是出现了问题。很明显我是少了什么东东。后来我改用下面的方法解决了问题。
- 选中项目,右键->属性->定位到VC++目录项

- 在"可执行文件目录"里添加上lua的安装目录。过程如下:



定位到Lua的安装文件夹,我的是:

确定后返回
- 用同样的步骤,将"lua安装目录\5.1\include"添加到"包含目录";
- 将"lua安装目录\5.1\lib"添加到"库目录";
- 跳到"连接器"的"输入"栏。将"附加依赖项"中添加上"lua51.lib;lua5.1.lib";
至此环境基本就配置好了。类似下面:


现在我们用代码测试一遍:
#include "stdafx.h"
#include <iostream>
#include <string.h>
using namespace std;
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
void main()
{
//1.创建一个state
lua_State *L = luaL_newstate();
//2.入栈操作
lua_pushstring(L, "Hello World~");
//3.取值操作
if (lua_isstring(L, )) { //判断是否可以转为string
cout << lua_tostring(L, ) << endl; //转为string并返回
}
//4.关闭state
lua_close(L);
system("pause");
return;
}
是不是木有问题啦╮(╯▽╰)╭
喏,我们亲爱的World君

- Lua与C++的交互测试
上面我们已经把需要的环境什么的都配置好了,现在重头戏上场( ̄︶ ̄)
- 我们建一个test.lua文件;
function Communicate(name)
return ("Hello "..name..", I`m in Lua");
end- 我们调用lua文件的cpp代码
#include "stdafx.h"
#include <iostream>
#include <string.h>
using namespace std; extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
void main()
{
string hello = "This is Zack, I`m in C++";
cout << hello.c_str() << endl;
//创建Lua状态
lua_State *L = luaL_newstate();
if (L == NULL)
{
return;
} //加载Lua文件
int bRet = luaL_loadfile(L, "test.lua");
if (bRet)
{
cout << "load file error" << endl;
return;
} //运行Lua文件
bRet = lua_pcall(L, , , );
if (bRet)
{
cout << "pcall error" << endl;
return;
}
//读取函数
lua_getglobal(L, "Communicate"); // 获取函数,压入栈中
lua_pushstring(L, "Zack"); // 压入参数
int iRet = lua_pcall(L, , , );// 调用函数,调用完成以后,会将返回值压入栈中,第一个1表示参数个数,第二个1表示返回结果个数。
if (iRet) // 调用出错
{
const char *pErrorMsg = lua_tostring(L, -);
cout << pErrorMsg << endl;
lua_close(L);
return;
}
if (lua_isstring(L, -)) //取值输出
{
string Result = lua_tostring(L, -);
cout << Result.c_str() << endl;
} //关闭state
lua_close(L);
system("pause");
return;
}
结果:

嗯,大功告成。就酱紫了╰( ̄▽ ̄)╮╭(′▽`)╯╰( ̄▽ ̄)╮
Lua与C++交互初探之C++调用Lua的更多相关文章
- Lua与C++交互初探之Lua调用C++
Lua与C++交互初探之Lua调用C++ 上一篇我们已经成功将Lua的运行环境搭建了起来,也成功在C++里调用了Lua函数.今天我来讲解一下如何在Lua里调用C++函数. Lua作为一个轻量级脚本语言 ...
- lua入门之二:c/c++ 调用lua及多个函数返回值的获取
当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 同样类型的栈来交互. C 函数从栈中获取她的參数.调用结束后将返回结果放到栈中.为了区分返回结果和栈中的其它的值,每一个 C 函数还会返回结 ...
- Lua和C++交互详细总结
转自:http://cn.cocos2d-x.org/tutorial/show?id=1474 一.Lua堆栈 要理解Lua和C++交互,首先要理解Lua堆栈. 简单来说,Lua和C/C++语言通信 ...
- [转载]Lua和C++交互详细总结
原文请看:Lua和C++交互详细总结 转自:http://cn.cocos2d-x.org/tutorial/show?id=1474 一.Lua堆栈 要理解Lua和C++交互,首先要理解Lua堆栈. ...
- lua调用java java调用lua[转载]
转载:http://dualface.github.io/blog/2013/01/01/call-java-from-lua/LuaJavaBridge - Lua 与 Java 互操作的简单解决方 ...
- Lua和C交互的简易教程
转载请标明出处:http://blog.csdn.net/shensky711/article/details/52458051 本文出自: [HansChen的博客] Lua栈 要理解Lua和C++ ...
- Step By Step(C调用Lua)
Step By Step(C调用Lua) 1. 基础: Lua的一项重要用途就是作为一种配置语言.现在从一个简单的示例开始吧. --这里是用Lua代码定义的窗口大小的配置信息 wid ...
- c++调用lua
我们主要解决如下几个问题: 转:http://www.cnblogs.com/zisou/p/cocos2dx-lua2.html http://www.cnblogs.com/sevenyuan/p ...
- VC和VS调用Lua设置以及Lua C API使用。
通过c++调用lua 脚本, 环境VC++6.0 lua sdk 5.1.4 在调用前先认识几个函数.1.调用lua_open()将创建一个指向Lua解释器的指针.2. luaL_ope ...
随机推荐
- java 实体 set数据 报空指针异常
今天在做一个调用阿里云AXB隐私保护,需要调用通话记录的消费队列,然后set到实体中,然后插入到数据库,但是set的这一步报错 以为工具拿不到值,然后打印发现是有值的, 然后再看一下实例的类型是没错的 ...
- python基础(一)内置类型及方法
python 内置类型主要包含7大类: 数字 序列 映射 文件 类 实例 异常 其中,最常用数据类型为序列 序列 python中包含7种内建序列 列表(list):由方括号构成,用逗号分隔项目: [a ...
- intellij idea 怎么全局搜索
1.Ctrl+N按名字搜索类 相当于eclipse的ctrl+shift+R,输入类名可以定位到这个类文件,就像idea在其它的搜索部分的表现一样,搜索类名也能对你所要搜索的内容多个部分进行匹配,而且 ...
- UVA - 11346 Probability(概率)(连续概率)
题意:在[-a, a]*[-b, b]区域内随机取一个点P,求以(0, 0)和P为对角线的长方形面积大于S的概率(a,b>0, S>=0). 分析: 1.若长方形面积>S,则选取的P ...
- HDU 5480:Conturbatio 前缀和
Conturbatio Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...
- redis qps监控
最近有个客户反应redis的qps不准确,通过查看代码,发现我们的监控是调用的redis info里面的instantaneous_ops_per_sec 客户反应说自己压测了ns,但是从监控上看不到 ...
- RFX2401C与RFX2402E的区别
随着科技的发展,射频设备也慢慢的普及,射频放大器在射频设备中起着非常重要的作用.为了能获得足够大的距离,必须都要外加射频信号放大器. 射频信号放大器简称 “PA”.PA主流应用主要有ZigBee .无 ...
- 基于UWB技术的DW1000芯片简单解析
近些年来随着物联网和机器人技术的大发展,精确定位技术的热度也随之攀升.目前精确定位的技术有很多,如基于wifi.RFID.zigbee.超声波.UWB等技术都可以实现精准定位.由于技术的不同,精度也不 ...
- matlab中自带的sobol的函数提供的sobol序列
clc; clear all; close all; M=;% 维度,几个参数 nPop=; VarMin=[0.6, 0.10, 0.002, 0.02, 0.17, 0.0, 0.17, 0.0, ...
- Swift之分割视图控制器-UISplitViewController
Swift之分割视图控制器-UISplitViewController UISplitViewController这种控制器只能用于iPad,它可以在iPad屏幕中显示两个不同的场景:在横向模式下,左 ...