今晚,花了两个多钟折腾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. Js闭包的用途

    本来想总结一点JavaScript中的闭包的一些用法,在查资料的时候发现了一篇很好的文章,就转过来收藏了,下面附上传送门: js闭包的用途 ---------sunlylorn 我们来看看闭包的用途. ...

  2. C#根据函数名称执行对应的函数

    using System; using System.Collections.Generic; using System.Reflection; namespace test { public cla ...

  3. c# 另存为excel

    去网上找了一下  看了一个比较简单的新建excel然后另存为. 要引用Microsoft.Office.Interop.Excel命名空间,如果没有的话 ,百度比我懂. 直接付代码: Microsof ...

  4. C语言中两个相等的char值比较 结果为false

    unsigned char appendChar1[] = {0xD3, 0xD0, 0xCF, 0xDE, 0xB9, 0xAB, 0xCB, 0xBE}; char appendChar2[] = ...

  5. 关于在页面上执行sql语句

    在页面上执行sql语句,首先在页面上顶一个文本域,让用户输入需要执行的sql语句. html代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML ...

  6. yii2 安装过程中的问题及解决方法

    一.php版本要求5.4+,如果使用wamp组合包,建议更换 二.各种模块的支持,一般只要修改php.ini文件,去掉相应模块前的注释即可. 注意,Intl extension模块的支持需要将     ...

  7. Qt5.3.0 for android windows平台下搭建及demo(虫子的博客)

    ----我的生活,我的点点滴滴!! 部门领导突然心血来潮,想在android平台上做应用,但是我们大多产品属于嵌入式(本吊只负责写写应用,苦比的被强行顶过来搞这,由于这还得领导吵了一架,架虽然吵完了, ...

  8. C语言malloc和free实现原理

    以下是一段简单的C代码,malloc和free到底做了什么? int main() { char* p = (char*)malloc(32); free(p); return 0; } malloc ...

  9. 网易云课堂_C语言程序设计进阶_第8周:图形交互程序

    8.2函数指针 8.2函数指针 #include <stdio.h> #include <stdlib.h> void f(int i) { printf("void ...

  10. jquery去除字符串首尾空格的方法:$.trim()

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...