记一次C++与lua连接
今晚,花了两个多钟折腾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连接的更多相关文章
- lua连接redis集群
连接redis集群需要用到llua-resty-redis-cluster模块 github地址:https://github.com/cuiweixie/lua-resty-redis-cluste ...
- 随记PC-win7 64位系统网络连接状态一直转圈、等待状态的异常解决方案
各位看官好~ 最近电脑也做了下升级,入手个士必得360G的SSD来玩玩,顺便也下个新系统,看看有什么区别,想想顺便升级下系统也是好的,就开始了装机,装系统的路程~~~~~~ 好了不说废话,直接进入主题 ...
- 架构师养成记--22.客户端与服务器端保持连接的解决方案,netty的ReadTimeoutHandler
概述 保持客户端与服务器端连接的方案常用的有3种 1.长连接,也就是客户端与服务器端一直保持连接,适用于客户端比较少的情况. 2.定时段连接,比如在某一天的凌晨建立连接,适用于对实时性要求不高的情况. ...
- 记一次Docker中Redis连接暴增的问题排查
周六生产服务器出现redis服务器不可用状态,错误信息为: 状态不可用,等待后台检查程序恢复方可使用.Unexpected end of stream; expected type 'Status' ...
- 记一次MacBook Pro无法连接wifi网络修复
解决方案: https://blog.csdn.net/kimbing/article/details/79321001 真的哭了 原因是插入了我的USB3.0拓展坞影响了wifi信号 不知道原理是啥 ...
- Lua笔记(1)
今天开始学习Lua,下面把一些重点记下来: 单行注释-- ,多行注释 --[[ ....... --]] Lua中false和nil表示条件判断的假,其余的,包括空字符串,0,都表示真. Lua没 ...
- 我和Lua并非一见钟情,我们期待着日久生情(相遇篇)
Lua作为一款轻量级的脚本语言,由标准C编写而成,可被C/C++调用,也可调用C/C++的函数. 在目前的脚本引擎中,Lua的速度是最快的... Lua可直接在EditPlus文本处理器上开发,只需搭 ...
- Linux 下 Lua 与 LuaSQL 模块安装
相关说明: Lua最近在Nginx的web服务器上挺火的, 它的高效让更多开发喜欢上它, 本文讲述Lua与LuaSQL的安装. 在上几篇mysql-proxy的安装中有提到和操作过. 操作系统: Li ...
- Lua 数据库访问(转)
本文主要为大家介绍 Lua 数据库的操作库:LuaSQL.他是开源的,支持的数据库有:ODBC, ADO, Oracle, MySQL, SQLite 和 PostgreSQL. 本文为大家介绍MyS ...
随机推荐
- C# 3循环 for语句
循环:可以反复执行某段代码,直到不满足循环条件为止. 一.循环的四要素:初始条件.循环条件.状态改变.循环体. 1.初始条件:循环最开始的状态. 2.循环条件:在什么条件下进行循环,不满足此条件,则循 ...
- js学习日记 (1)createDocumentFragment() ES6 => 箭头
只能说是会用和记载,深入理解还需时间. 有关性能优化: 使用createdocumentfragment()方法可以创建某个具有节点该有的所有属性的节点. 使用情况: 提取文档中的某个小部分,修改文 ...
- Linux下 静态链接库 和 动态链接库
先来说说C/C++编译过程 编译: 检查语句符号定义,将C/C++代码翻译生成中间语言. 链接: 将中间代码整合,生成可执行的二进制代码. 简单的说,库文件都是一种特殊的中间语言文件,静态库还是一种特 ...
- self-introduction
2014.9被同桌kpm带入坑....虽然现在不同班了...(Orz搞分班程序坑了他自己...) 入OI之后就没什么其他兴趣了...偶尔看看番.. 是数据结构控..(算不上吧?) 指针党. 来自广东 ...
- "Classifying plankton with deep neural networks" notes
cross entropy loss is not quite the same as optimizing classification accuracy. Althougth the two ar ...
- Python 提示 no module named win32api
Windows下运行Python程序 提示错误 说是没有win32api的模块 解决办法 : 安装pywin32对应于Python的版本 可从https://sourceforge.net/pro ...
- makefile死磕笔记
开始我会插播一段我如何学习makefile的废话,如果不想听的话,请直接跳到我的makefile教程. 首先得先说明学习makefile真是一个痛苦的过程,尤其是用干巴巴的看书来学习的过程,简直可以用 ...
- Ghost win7 系统安装(虚拟机)
1.将Ghost.iso添加到数据存储iso文件中,启动虚拟机,根据相关提示,文件格式化系统硬盘,完成操作后关机: 2.进入BIOS,设置从CDROM启动系统(否则系统会提示找到引导文件): 3.将系 ...
- CC EAL认证
国际通用准则(CC) CC(Common Criteria)是国际标准化组织统一现有多种准则的结果,是目前最全面的评价准则.1996年6月,CC第一版发布:1998年5月,CC第二版发布:1999年 ...
- android PopupWindow显示位置
PopupWindow的显示及位置设置 window.showAtLocation(parent, Gravity.RIGHT | Gravity.BOTTOM, 10,10); 第一个参数指定Pop ...