今晚,花了两个多钟折腾lua和c++的互连,终于成功了,觉得有必要记录下来。说实话,搜索引擎真是有利有弊,利在你有地方搜答案,弊则在于你半天都找不到正确的答案甚至找到误导你的答案,今晚更加加深了我的体会,不过总算折腾出点成果了。

前期准备:装好LuaForWindows(LFW),装好Visual Studio 2013(其实用6.0就已经足够了)。

接下来,打开VS,新建一个解决方案,在解决方案下新添加一个工程,作为我的第一个例子,就新建了一个win32控制台程序。然后,右键工程设置它的属性:

配置属性->VC++目录->可执行文件目录,设置LFW目录,例:E:\Program\lua\5.1

配置属性->VC++目录->包含目录,设置include文件夹,例:E:\Program\lua\5.1\include

配置属性->VC++目录->库目录-设置lib目录,例:E:\Program\lua\5.1\lib

链接器->输入->附加依赖项,添加“lua5.1.lib;lua51.lib”

接下来,送上C++代码了,在网上东拼西凑,再加点自己代码的混合体:

 // Test.cpp : 定义控制台应用程序的入口点。
//
// Lua和C通过一堆栈struct lua_State交换数据,栈底为1,栈顶为-1,默认大小20
// lua_checkstack : 修改栈大小
// lua_gettop : 获得栈元素数目
// lua_getglobal : 获取某全局变量,void lua_getglobal(lua_State*L, constchar*name)
// lua_isnumber/ lua_istable : 判断类型
// lua_tonumber/ lua_tostring : 类型转换
// lua_pushstring : 压入栈顶,如lua_pushstring(L, "i")
// lua_pushnil : 压入一空值
// lua_remove : 从栈移除元素
// lua_gettable :
// lua_next : 遍历数组(key从1开始的table),如while(lua_next(L, -2)!=0){}
//
// lua_newtable(L) - 新建table放在栈顶
// lua_pushstring(L,"mydata") - 压入key
// lua_pushnumber(L,66) - 压入value
// lua_settable(L, -3)
// lua_rawseti(L, -2, 0)
// ...
//
// 调用Lua函数可以这样理解吧,压入函数->压入参数->call->返回值已经在栈顶。不知道对不对
//
#include "stdafx.h"
#include "stdlib.h"
extern "C"{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}; lua_State *L;
int luaAdd(int x, int y)
{
int sum;
lua_getglobal(L, "add"); //Lua函数也是变量(指针),可入栈
lua_pushnumber(L, x); //参数入栈
lua_pushnumber(L, y); //参数入栈
lua_call(L, , );
sum = (int)lua_tonumber(L, -);
lua_pop(L, );
return sum;
} int _tmain(int argc, _TCHAR* argv[])
{
int sum = ;
L = lua_open(); //创建Lua接口指针
luaopen_base(L); //加载Lua基本库
luaL_openlibs(L); //加载Lua通用扩展库
luaL_loadfile(L, "add.lua"); //加载脚本
lua_pcall(L, , LUA_MULTRET, ); //调用Lua函数,pcall函数会自动清除入栈变量(虚拟机指针,,,)
sum = luaAdd(, );
printf("The sum is %d\n", sum);
lua_close(L);
system("PAUSE");
return ;
}

还有add.lua脚本:

--简单的例子,只做整数加法
function add(x, y)
return x + y
end

脚本保存在工程目录下,和cpp文件住在一起。

总算看到控制台的显示“The sum is 25”了,虽说,整个过程写出来好像很简单的样子,但折腾一下就知道探索的过程有多辛苦了!

记一次C++与lua连接的更多相关文章

  1. lua连接redis集群

    连接redis集群需要用到llua-resty-redis-cluster模块 github地址:https://github.com/cuiweixie/lua-resty-redis-cluste ...

  2. 随记PC-win7 64位系统网络连接状态一直转圈、等待状态的异常解决方案

    各位看官好~ 最近电脑也做了下升级,入手个士必得360G的SSD来玩玩,顺便也下个新系统,看看有什么区别,想想顺便升级下系统也是好的,就开始了装机,装系统的路程~~~~~~ 好了不说废话,直接进入主题 ...

  3. 架构师养成记--22.客户端与服务器端保持连接的解决方案,netty的ReadTimeoutHandler

    概述 保持客户端与服务器端连接的方案常用的有3种 1.长连接,也就是客户端与服务器端一直保持连接,适用于客户端比较少的情况. 2.定时段连接,比如在某一天的凌晨建立连接,适用于对实时性要求不高的情况. ...

  4. 记一次Docker中Redis连接暴增的问题排查

    周六生产服务器出现redis服务器不可用状态,错误信息为: 状态不可用,等待后台检查程序恢复方可使用.Unexpected end of stream; expected type 'Status' ...

  5. 记一次MacBook Pro无法连接wifi网络修复

    解决方案: https://blog.csdn.net/kimbing/article/details/79321001 真的哭了 原因是插入了我的USB3.0拓展坞影响了wifi信号 不知道原理是啥 ...

  6. Lua笔记(1)

    今天开始学习Lua,下面把一些重点记下来: 单行注释-- ,多行注释 --[[  .......  --]] Lua中false和nil表示条件判断的假,其余的,包括空字符串,0,都表示真. Lua没 ...

  7. 我和Lua并非一见钟情,我们期待着日久生情(相遇篇)

    Lua作为一款轻量级的脚本语言,由标准C编写而成,可被C/C++调用,也可调用C/C++的函数. 在目前的脚本引擎中,Lua的速度是最快的... Lua可直接在EditPlus文本处理器上开发,只需搭 ...

  8. Linux 下 Lua 与 LuaSQL 模块安装

    相关说明: Lua最近在Nginx的web服务器上挺火的, 它的高效让更多开发喜欢上它, 本文讲述Lua与LuaSQL的安装. 在上几篇mysql-proxy的安装中有提到和操作过. 操作系统: Li ...

  9. Lua 数据库访问(转)

    本文主要为大家介绍 Lua 数据库的操作库:LuaSQL.他是开源的,支持的数据库有:ODBC, ADO, Oracle, MySQL, SQLite 和 PostgreSQL. 本文为大家介绍MyS ...

随机推荐

  1. Asp.Net长文件名下载的问题和解决办法

    在Asp.Net中写了一个附件上传和下载的程序,附件上传到数据库中,然后将附件的GUID保存起来,我们可以根据GUID来找到数据库中的附件,一般附件下载的代码是: <!--<br /> ...

  2. 随机抽样一致性算法(RANSAC)

    本文翻译自维基百科,英文原文地址是:http://en.wikipedia.org/wiki/ransac,如果您英语不错,建议您直接查看原文. RANSAC是"RANdom SAmple ...

  3. JSP简介

    论坛 博客 微论 问答 游戏厅 天涯客 读书 更多 手机 服务 登录 注册   聚焦 民生 文学 旅游 财经 汽车 IT数码 时尚 情感 娱乐 视频 更多 北京 上海 广东 更多 天涯部落> J ...

  4. OC——NSString的常用方法

    NSString *str1 = @"BeiJing"; NSString *str2 = @"beijing"; //全部转为大写 NSLog(@" ...

  5. (转)C#与C++之间类型的对应

    C#与C++之间类型的对应 Windows Data Type .NET Data Type BOOL, BOOLEAN Boolean or Int32 BSTR String BYTE Byte ...

  6. WPF中timer的使用

    Timer控件/ System.Timers.Timer 不能用于WPF中.在WPF中,定时器为 DispatcherTimer. 使用方法如下: private DispatcherTimer ti ...

  7. hdu1711Number Sequence

    Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], .... ...

  8. [Tree]Binary Tree Preorder Traversal

    Total Accepted: 97599 Total Submissions: 257736 Difficulty: Medium Given a binary tree, return the p ...

  9. 互联网大公司的CEO,多是程序员出身

    互联网有个现象,大公司的CEO,多是程序员出身.举例如下:------马化腾93年深大计算机系毕业,进入润迅通信从软件工程师做到开发部主管,98年11月与张志东等凑齐50万元注册腾讯公司,99年2月开 ...

  10. Javascript 多物体运动——逐行分析代码,让你轻松了解运动的原理

    我们先来看下之前的运动的代码,是否支持多物体运动,会出现怎么样的问题. <style type="text/css"> div { width: 100px; heig ...