C++与Lua交互

理解Lua和C++交互原理,首先要理解堆栈和全局表

堆栈

Lua和C/C++语言交互的主要方法是一个无处不在的虚拟栈,栈的特点是先进后出。

1.堆栈索引的方式可是是正数也可以是负数。

2.正数索引1永远表示栈底,负数索引-1永远表示栈顶。

3.在Lua中,Lua堆栈就是一个struct.

入栈的数据类型有数值, 字符串, 表等, 但是最后都是统一用TValue这种数据结构来保存。


全局表

  Lua的全局表是一个map哈希表结构,比如Lua有一个变量:

           key = “value”

  全局表中就会存放key和value的对应关系,然后通过key在全局表中查找到world


交互原理

1.C++想要获取Lua中的key对应字符串的值,首先把key放到堆栈(栈顶),方便Lua看到。

2.Lua从堆栈(栈顶)获取到key的值,此时栈顶为空。

3.Lua去全局表中查找key对应的字符串

4.全局表返回对应的字符串value

5.Lua再把value放到堆栈(栈顶)

6.C++从堆栈(栈顶)获取value的值


C++调用Lua

Lua调用C++

  1.将C函数作为应用程序的一部分

       函数在main方法里注册,使C函数成为全局函数,供Lua调用。

  2.将C函数作为Lua的模块

     将C函数注册后封装到一个模块中,以库的方式调用,比如在windows系统以dll文件存在,使用时在Lua中require进来就行了。

可以发现无论是在c程序中创建一个lua环境来执行lua代码,还是导出C模块供lua程序使用,都需要手动将C函数注册到lua环境中;另外,C 函数参数和返回值都需要手动操作栈。这个效率是很慢的,最好的办法就是像写普通 C代码一样,然后将 C程序导出成 lua 可以直接调用的代码,tolua 就是干这个事。


进阶(tolua)

    tolua是一个工具,负责从包文件(.pkg)生成.c文件或者.cpp文件,这个.c/cpp源文件导出提供Lua调用的源码,并参与工程编译

在windows系统tolua有以下几个文件

   tolua.exe 用于将.pkg生成.cpp文件

   tolua.dll

   tolua.lib

   tolua.h   

tolua使用步骤

   1.正常编写C++代码,然后编译对应的.pkg文件,pkg文件基本语法与.h保持一致,

   2.使用 tolua.exe 从 package 文件生成相应的 c/c++ 源文件。在 tolua.exe 所有目录打开命令行,然后输入 tolua -n [mylib] -o [test.cpp] test.pkg。-n 参数指明这个文件所在的包,如果不写的话就默认跟文件名一样,-o 指明生成的源文件名,这个参数是必须的,最后就是源 package 文件

   3.将tolua生成的.cpp源文件参与工程项目编译,在创建lua环境之后调用源文件导出的方法tolua_mylib_open.之后lua就可以调用.pkg里面声明的C++方法。

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

推荐阅读更多精彩内容

  • 最近我负责的一个线上 Lua 服务偶尔会 crash,陆陆续续查了好几个星期,上周终于解决了,记录一下排查的过程和...
    豌豆很烦阅读 1,012评论 0 1
  • 参考: https://blog.csdn.net/v_xchen_v/article/details/77249...
    凉夜lrs阅读 754评论 0 0
  • http://blog.csdn.net/u012926027/article/details/50402899 ...
    曾令伟阅读 1,908评论 0 1
  • 1 预备知识 1.1 接口函数 接口函数都是由Lua虚拟机提供的,供C程序调用的函数 lua.h里的所有函数都是以...
    凉拌姨妈好吃阅读 1,832评论 3 0
  • Q:什么是Lua的虚拟栈? A:C与Lua之间通信关键内容在于一个虚拟的栈。几乎所有的调用都是对栈上的值进行操作,...
    abios阅读 1,013评论 0 2