今晚,花了两个多钟折腾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. Banner 切换

    在线项目 :  Banner 切换 时间 : 2个小时 (15:00 - 17:00)满分 : 100分------------------------------------------------ ...

  2. zendStudio安装Xdebug项目断点调试

    1,首先安装xdebug插件 传送门 2,配置php.ini文件如下: [XDebug] xdebug.profiler_append = xdebug.profiler_enable = xdebu ...

  3. Kurskal算法(克鲁斯卡尔算法)

    特点:适用于稀疏图,边比较少的图.如果顶点较少,且为稠密图,则用Prim算法.跟Prim算法的用途相同.时间复杂度为O(e*loge),其中e为边数. 代码: #include <stdio.h ...

  4. 使用PowerShell管理Windows8应用

    引子(?): 我从消费者预览版开始使用的win8,大概是因为我年龄不大的缘故,我很快熟悉了这个操作系统并习惯了使用windows8的Modern App.我之前使用过一个叫Windows8 Moder ...

  5. C++#define的用法(含特殊)

    1 无参宏定义无参宏的宏名后不带参数.其定义的一般形式为:    #define 标识符 字符串其中的“#”表示这是一条预处理命令.凡是以“#”开头的均为预处理命令.“define”为宏定义命令.“标 ...

  6. js:关于IE6/7下new Date(值)输出为NaN的解决方案

    不得不再次说,万恶的IE,你太守旧了吧,这里出错的原因是IE的时间格式,不是2012-01-23(很多人喜欢用这样的格式) 而是2012/01/23(怎么感觉像是在用VB6和access啊) 搞了好久 ...

  7. Android之修改部分字体颜色

    #01# 方法一: TextView textView = (TextView) view.findViewById(R.id.text); SpannableString ss = new Span ...

  8. 关于http状态码204理解

    HTTP的状态码有很多种,主要有1xx(临时响应).2xx(成功).3xx(已重定向).4xx(请求错误)以及5xx(服务器错误)五个大类,每个大类还对应一些具体的分类.平时我们接触比较多的是200. ...

  9. 有结果集的mysqli函数获取行数和列数

    <?php $mysqli=new mysqli("localhost", "root", "123456", "xsphp ...

  10. 使用file_get_content系列函数和使用curl系列函数采集图片的性能对比

    由于公司的一个汽车网站的后台的汽车内容都是主要是来自与汽车之家的,编辑的同事们必须天天手动去对着汽车之家来添加汽车,实在是太蛋疼了.于是乎,为了改变这种状况,作为一个开发码农,我的任务就来了...那就 ...