今晚,花了两个多钟折腾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. C# 3循环 for语句

    循环:可以反复执行某段代码,直到不满足循环条件为止. 一.循环的四要素:初始条件.循环条件.状态改变.循环体. 1.初始条件:循环最开始的状态. 2.循环条件:在什么条件下进行循环,不满足此条件,则循 ...

  2. js学习日记 (1)createDocumentFragment() ES6 => 箭头

    只能说是会用和记载,深入理解还需时间. 有关性能优化: 使用createdocumentfragment()方法可以创建某个具有节点该有的所有属性的节点. 使用情况:  提取文档中的某个小部分,修改文 ...

  3. Linux下 静态链接库 和 动态链接库

    先来说说C/C++编译过程 编译: 检查语句符号定义,将C/C++代码翻译生成中间语言. 链接: 将中间代码整合,生成可执行的二进制代码. 简单的说,库文件都是一种特殊的中间语言文件,静态库还是一种特 ...

  4. self-introduction

    2014.9被同桌kpm带入坑....虽然现在不同班了...(Orz搞分班程序坑了他自己...) 入OI之后就没什么其他兴趣了...偶尔看看番.. 是数据结构控..(算不上吧?)  指针党. 来自广东 ...

  5. "Classifying plankton with deep neural networks" notes

    cross entropy loss is not quite the same as optimizing classification accuracy. Althougth the two ar ...

  6. Python 提示 no module named win32api

    Windows下运行Python程序 提示错误  说是没有win32api的模块 解决办法 : 安装pywin32对应于Python的版本  可从https://sourceforge.net/pro ...

  7. makefile死磕笔记

    开始我会插播一段我如何学习makefile的废话,如果不想听的话,请直接跳到我的makefile教程. 首先得先说明学习makefile真是一个痛苦的过程,尤其是用干巴巴的看书来学习的过程,简直可以用 ...

  8. Ghost win7 系统安装(虚拟机)

    1.将Ghost.iso添加到数据存储iso文件中,启动虚拟机,根据相关提示,文件格式化系统硬盘,完成操作后关机: 2.进入BIOS,设置从CDROM启动系统(否则系统会提示找到引导文件): 3.将系 ...

  9. CC EAL认证

    国际通用准则(CC) CC(Common Criteria)是国际标准化组织统一现有多种准则的结果,是目前最全面的评价准则.1996年6月,CC第一版发布:1998年5月,CC第二版发布:1999年 ...

  10. android PopupWindow显示位置

    PopupWindow的显示及位置设置 window.showAtLocation(parent, Gravity.RIGHT | Gravity.BOTTOM, 10,10); 第一个参数指定Pop ...