曾经一直用C++写代码。话说近期刚换工作。项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有。
新建cocos2dx-lua项目。打开class能够发现,事实上就是C++项目啦,只是为什么仅仅有一类Appdelegate类呢?哈哈,我相信聪明的你一定猜到了,伦家其它代码都下载lua里面了,在C++中调用就能够了,如今就来看看C++是怎样调用Lua脚本的吧。
说下我用的Lua版本号是5.2.3,系统是Linux。为什么是Linux呢,学编程最好是Linux啦,一切从最基础開始,理解得更加透彻。。当然,假设工作还是要用开发环境的啦。毕竟能够提高效率嘛。

一 C++ 调用Lua
1 文件夹结构
先看下我的文件夹结构吧。生成lua库。不会生成Lua库,能够參考我的还有一篇文字:Lua学习笔记1:开发环境搭建(windows和linux),提醒下,这个版本号的lua须要多拷贝一个luaconf.h文件。
CppCallLua
{
main.cpp
script{
test.lua
}
lualib{
lua.h
lualib.h
laux.h
luaconf.h
liblua.a
}
}
2 代码
以下的样例是在C++中调用lua脚本里面定义的add函数。且看CPP中的代码:
//main.cpp
#include <iostream>extern "C"
{
#include "lualib/lua.h"
#include "lualib/lualib.h"
#include "lualib/lauxlib.h"
}using namespace std;int main()
{lua_State* L = luaL_newstate() ;luaopen_base(L) ;// 不知道为什么这里使用luaL_openlibs(L)会报错luaL_dofile(L, "script/test.lua") ;lua_getglobal(L, "add") ;lua_pushnumber(L, 1) ;lua_pushnumber(L, 2) ;lua_pcall(L, 2, 1, 0) ;int sum = (int)lua_tonumber(L, -1) ;lua_pop(L, -1) ;lua_close(L) ;cout << "1 + 2 = " << sum << endl;return 0 ;
}

以下是Lua脚本中的内容:
//test.lua
function add(x, y)return x + y
end

编译命令:

g++ main.cpp -L./lualib -llua

二 lua调用C++
lua调用C++函数还是以C++为主体。在C++中使用执行Lua脚本,在Lua脚本中又调用C++自己实现的函数。

实际上就C++通过Lua脚本调用自己的函数。

cocos2dx中那些个Lua接口,调用的都是C++中定义的函数。

以下的样例是在lua中调用C++实现的求平均值和求和。
1 文件夹结构
LuaCallCpp
{
main.cpp
test.lua
lualia{
lua.h
lualib.h
laux.lib.h
luaconf.h
liblua.a
}

2 代码
// main.cpp
#include <iostream>extern "C"
{
#include "lualib/lua.h"
#include "lualib/lualib.h"
#include "lualib/lauxlib.h"
}using namespace std;lua_State* L ;static int average(lua_State *L)
{// num of argsint n =  lua_gettop(L) ;double sum = 0 ;int i = 0 ;for ( i = 1; i <= n; ++i){sum += lua_tonumber(L, i) ;}// push the averagelua_pushnumber(L, sum / n) ;// push the sumlua_pushnumber(L, sum) ; return 2;
}int main()
{L = luaL_newstate() ;luaopen_base(L) ;// register functionlua_register(L, "average", average) ;luaL_dofile(L, "test.lua") ;lua_close(L) ;return 0 ;
}

// test.lua
avg, sum = average(1, 2, 3, 4, 5)
print ("The average is ", avg)
print ("The sum is ", sum)

先就到这里了。假设有错误还请路过的大神指点一二。

Lua学习笔记6:C++和Lua的相互调用相关推荐

  1. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  2. 微信小程序连接物联网(二):NodeMCU Lua学习笔记

    索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...

  3. lua 学习笔记---游戏开发第一步

    lua 学习笔记-从数组开始 数组 数组大小范围不一定需要在声明是确定,可以改变 一维数组 例 > array = {"Lua", "lualu"} &g ...

  4. c# 学习笔记 (2) 窗体之间互相调用的方法

    c# 学习笔记 (2) 窗体之间互相调用的方法 创建一个winform工程 创建两个窗体 一个子窗体,一个父窗体,这里为了演示,子窗体和父窗体上都有一个文本框和按键,点击任意一个窗体上的按键,窗体上文 ...

  5. Windows保护模式学习笔记(三)—— 长调用/短调用/调用门

    Windows保护模式学习笔记(三)-- 长调用/短调用/调用门 要点回顾 长调用与短调用 一.短调用 二.长调用(跨段不提权) 三.长调用(跨段并提权) 长调用执行时: 执行返回(RETF)时: 总 ...

  6. Java web与web gis学习笔记(二)——百度地图API调用

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  7. Qml学习笔记:cpp与qml的交互调用方式

    Qml学习笔记:cpp与qml的交互调用方式 如何用在cpp中调用qml的方法 main.qml main.cpp 如何在qml中调用C++的方法函数 main.cpp main.qml 如何使用qm ...

  8. Lua学习笔记(2)

    前段时间忙于其他事,没有继续Lua的学习,现在继续我们的Lua学习吧. 首先先推荐一本书<Programming in Lua>中文版名称<Lua编程>,这本书从最基础的部分开 ...

  9. Lua 学习笔记(一)环境搭建

    Lua是一个小巧的脚本语言.Lua由标准C编写而成,代码简洁,几乎在所有的操作系统和平台上都可以编译,运行. 主要讲一下mac和win下的环境搭建. 工具: 1.Sublime Text 2 2.Lu ...

最新文章

  1. 悠然乱弹:我的开源观
  2. TensorFlow基础5-可训练变量和自动求导机制
  3. HDU 1166 敌兵布阵【树状数组】
  4. 鸟哥的Linux私房菜(服务器)- 主机基本安全之一:限制 Linux 对外连线的端口
  5. Cell重磅综述:关于人类转录因子,你想知道的都在这
  6. 数据库之SqlDataAdapter
  7. 在layoutsubviews中设置子控件的frame,保证执行alpha和frame动画流畅度
  8. mel加载一个物体不同姿态的模型实现动画效果
  9. 一个简单的实现了智能虚拟女友—图灵机器人
  10. ApacheCN 翻译活动进度公告 2019.3.3
  11. 计算机网站之TCP报文结构
  12. 使用机器学习预测股价
  13. 明日之后 找不到服务器,明日之后服务器不一样怎么办_区服不同如何解决_软吧...
  14. xxxxxxxxxxxxxxxxx
  15. 常用照片尺寸和纸张尺寸参考
  16. java科技说明文范文800_说明文范文:生活因成功而精彩
  17. Cannot Resolve method subscribe(anonymous org.reactivestreams.Subscriber 已解决
  18. C语言中Strcpy 的使用
  19. printf打印字符串的时候可以printf(“%s“,buf);buf可以是字符串名或者指针
  20. 谈谈Spring Ioc的理解

热门文章

  1. Java线上程序频繁JVM FGC问题排障与启示
  2. Java中的ClassLoader和SPI机制
  3. Varnish Cache 3.0.0安装
  4. SQL Server 存储过程的分页方案比拼
  5. Linux下gdb调试工具的使用
  6. java写exe程序实例,java实现可安装的exe程序实例详解
  7. workbench应力应变曲线_说说真应力真应变
  8. bscroll 滚动位置_better-scroll初始滚动位置
  9. 所有表单对象_Laravel 表单方法伪造与 CSRF 攻击防护
  10. android usb 触摸屏 apk,Android插入USB设备,自动弹出提示运行apk