在VS2012中实现lua与C++的相互调用

分步骤总结一下在做这样一个小实例的过程中进行的工作和遇到的问题。
参考博客:
lua和c语言互相调用的例子
VS2012建立调用lua脚本工程

Lua环境

首先需要配置一下Lua语言环境,下载Lua的解释器

示例中我使用的是Lua 5.1版本

Lua5.1

新建和配置C++工程

在VS2012中新建一个“Win32 控制台应用程序”。

然后配置头文件目录
右键单击项目->属性->VC++目录
包含目录中添加Lua5.1中的include文件夹的路径,因为在C++中需要包含这个目录下的头文件。

然后添加依赖库
右键单击项目->连接器->输入
附加依赖项中添加Lua5.1中lib目录下的lib51.lib文件路径。这是执行lua脚本必不可少的库。

编写C++代码

在主函数(win32平台下,主函数名为_tmain)所在的cpp文件中编写如下代码:

// TestCppLua.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>

//包含lua相关头文件
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

//添加一个C++语言函数
int add(lua_State* L)
{
    //从lua状态机的栈中取出索引为1的int型数值
    int x = luaL_checkint(L, 1);
    //从lua栈中取出索引为2的int型数值
    int y = luaL_checkint(L, 2);
    printf("result:%d + %d = %d\n", x, y, x + y);
    return 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
    lua_State* L = luaL_newstate();     //新建一个lua状态机
    luaL_openlibs(L);   //打开相关的库
    lua_pushcfunction(L, add);  //将c++函数add入栈
    lua_setglobal(L, "ADD");    //设置全局符号ADD
    //加载lua脚本文件,这里使用了需要执行的Lua脚本文件的绝对路径
    if (luaL_loadfile(L, "E:\\TestProj\\TestCppProj\\TestCppLua\\TestCppLua\\myLua.lua"))
    {
        printf("error in load lua file.");
    }
    //执行一次脚本,生成function
    lua_pcall(L, 0, 0, 0);
    //将lua函数myfunction入栈
    lua_getglobal(L, "myfunction");
    //执行脚本,执行function
    lua_pcall(L, 0, 0, 0);

    printf("Lua is done.");
    getchar();
    return 0;
}

编写Lua脚本

新建了一个myLua.lua文件,在文件中写下如下的代码:

-- 定义一个myfunction函数
function myfunction()
    print("in myLua")
    ADD(1, 2)   -- 调用ADD函数
    ADD(100, 200)
end

运行这个实例

在VS2012中,调试我的win32控制台应用程序。在配置好包含目录和依赖库的情况下,代码一次编译通过
调试窗口如图:

调试窗口

运行过程总结

在C++中
1.定义一个add函数。
2.新建一个Lua状态机。
3.打开lua相关库。
4.函数add入栈,并设置全局变量ADD来表示C++中的add函数,可以在lua脚本中使用ADD来访问C++中的add函数。
5.加载lua脚本文件。
6.执行一次脚本,如果不执行,则lua脚本中定义的全局函数myfunction不会存在。
7.将lua脚本中的函数myfunction入栈。
8.再执行脚本,即会执行myfunction函数。

在Lua中
1.定义一个myfunction函数。在myfunction函数中调用全局函数ADD(这个函数实际是在C++代码中添加到Lua状态机中的)。

深入学习

看懂了上述过程,理解了C++调用Lua脚本的基本过程之后可以来看看这篇博客
Lua和C++交互详细总结

通过这篇博客可以更深入了解C++与Lua语言的配合使用。感谢以上几位博主。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容