c++与lua互相调用(内嵌式)

1.下载lua官网

2.解压 tar-zxvf

3.将源码导入项目里面,去掉lua.c和luac.c里面的main方法,在使用之前创建一个lua.hpp文件,作为后面的头文件

#ifndef LUA_HPP
#define LUA_HPP// lua.hpp
// Lua header files for C++
// <<extern "C">> not supplied automatically because Lua also compiles as C++extern "C" {#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#endif // LUA_HPP
QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \audio.cpp \lua/lapi.c \lua/lauxlib.c \lua/lbaselib.c \lua/lcode.c \lua/lcorolib.c \lua/lctype.c \lua/ldblib.c \lua/ldebug.c \lua/ldo.c \lua/ldump.c \lua/lfunc.c \lua/lgc.c \lua/linit.c \lua/liolib.c \lua/llex.c \lua/lmathlib.c \lua/lmem.c \lua/loadlib.c \lua/lobject.c \lua/lopcodes.c \lua/loslib.c \lua/lparser.c \lua/lstate.c \lua/lstring.c \lua/lstrlib.c \lua/ltable.c \lua/ltablib.c \lua/ltm.c \lua/lua.c \lua/luac.c \lua/lundump.c \lua/lutf8lib.c \lua/lvm.c \lua/lzio.c \main.cpp \mainwindow.cppHEADERS += \audio.h \include/fmod/fmod.h \include/fmod/fmod.hpp \include/fmod/fmod_codec.h \include/fmod/fmod_dsp.h \include/fmod/fmod_errors.h \include/fmod/fmod_memoryinfo.h \include/fmod/fmod_output.h \include/fmod/fmodiphone.h \include/fmod/fmodlinux.h \include/fmod/fmodwindowsphone.h \include/fmod/fmodwindowsstoreapp.h \lua/lapi.h \lua/lauxlib.h \lua/lcode.h \lua/lctype.h \lua/ldebug.h \lua/ldo.h \lua/lfunc.h \lua/lgc.h \lua/ljumptab.h \lua/llex.h \lua/llimits.h \lua/lmem.h \lua/lobject.h \lua/lopcodes.h \lua/lopnames.h \lua/lparser.h \lua/lprefix.h \lua/lstate.h \lua/lstring.h \lua/ltable.h \lua/ltm.h \lua/lua.h \lua/lua.hpp \lua/luaconf.h \lua/lualib.h \lua/lundump.h \lua/lvm.h \lua/lzio.h \mainwindow.hFORMS += \mainwindow.uiTRANSLATIONS += \sgs_zh_CN.tsLIBS += -L.
LIBS += -L"$$_PRO_FILE_PWD_/lib/"
LIBS += -lfmodex64
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

4.c++调用lua,先看界面图

界面说明,左边播放声音的按钮,右边播放bgm的,右边按钮播放的bgm从lua文件里面获取

两个槽函数与lua交互

void MainWindow::on_pushButton_clicked()
{Audio::play("audio/system/BackGroundMusic02.mp3",false);
}void MainWindow::on_pushButton_2_clicked()
{// 初始化lua虚拟机lua_State * l = luaL_newstate();luaL_openlibs(l);//这里用loadfaile,不执行int result =luaL_loadfile(l, "ext/bgm.lua");if (result){printf("load file error,result=%d\n",result);}// 执行lua文件,四个参数说明 lua_State *,参数个数,返回结果,最后一个表示出错的信息,具体含义还未知result = lua_pcall(l, 0, 0, 0);if (result){printf("load file error,result=%d\n",result);}//读取lua文件里面全局变量a,lua_getglobal(l, "a");//获取栈顶的数据,返回的是字符串const char* luaa = lua_tostring(l, -1);//转化为c++的stringstring a = luaa;cout << "a=" << a << endl;//读取b,转化为QStringlua_getglobal(l, "b");QString b(lua_tostring(l, -1));cout << "b=" << b.toStdString() << endl;// 获取并调用函数,第二个参数是函数名lua_getglobal(l, "fun");//把0作为置入栈顶lua_pushnumber(l, 0);//调用int iRet = lua_pcall(l, 1,1, 0);if (iRet){const char* error = lua_tostring(l, -1);cout << error << endl;lua_close(l);}// 获取结果if (lua_isstring(l, -1)){QString s = lua_tostring(l, -1);//播放bgmAudio::playBGM(s);}lua_close(l);}

lua文件

a = "E:/qt/workspace/sanguosha/sgs/audio/skill/juejing.ogg"
b = "E:/qt/workspace/sanguosha/sgs/audio/skill/jueqing1.ogg"
function fun(n)if n == 0 thenreturn aelsereturn bend
endc = "wo bu shi ni da ye haha ha"
-- 这个用来调用c++的
helloLua(c)

5.lua调用c++

#include "mainwindow.h"#include <QApplication>
#include "lua/lua.hpp"
#include<iostream>
using namespace std;
#include<QDebug>extern "C" int helloLua(lua_State *l){//取出参数printf("%s\n",lua_tostring(l, -1));return 1;
}int main(int argc, char *argv[])
{QApplication a(argc, argv);// 初始化lua虚拟机lua_State * l = luaL_newstate();qDebug()<< "逗比啊"<<endl;cout<<"哈哈,出bugle"<<endl;if(l==NULL){printf("哈哈,出bugle");}luaL_openlibs(l);const char *buf = "print('wo qu ni da ye de lua!')";//注册函数lua_register(l, "helloLua", helloLua);luaL_dofile(l, "ext/bgm.lua");luaL_dostring(l,buf);//销毁指定虚拟机的所有对像lua_close(l);MainWindow w;w.show();return a.exec();
}

调用大致思路,把数据放入栈,另一个语言去取数据,大致原理就这样子

磨刀不误砍柴工,先稍微巩固一下基础
太阳神三国杀第一弹,lua与c++交互,下一期把fmodex代码搬上来。

太阳神三国杀(一),c++与lua交互相关推荐

  1. 记一次太阳神三国杀的编译

    记一次太阳神三国杀的编译 这是一次学习太阳神三国杀的编译方法,奈何本人技术不大行,如有错误或者不周到的地方还请指出 以下的经验都是我自己遇到的问题,如果你也遇到了一样问题希望对你有所帮助 太阳神三国杀 ...

  2. qt编译太阳神三国杀

    qt编译太阳神三国杀 编译前置条件 qt环境本文环系统包括win10(qt5.14),deepinv15(qt5.9.9) g++编译,本文win10采用的是mingw64编译器 1.下载源码gith ...

  3. Mac下编译太阳神三国杀源码

    Mac系统版本是10.13.2,Qt版本是5.11,参考官方博文:太阳神三国杀 Mac 版构建指南 安装Qt5 下载最新的Qt5安装包qt-opensource-mac-x64-5.11.0.dmg, ...

  4. 太阳神三国杀学习第一步--编译并运行(qt5.7.0+vs2015)

    起因:     很早就想寻找一个开源的c++项目进行学习,也在很早就发现了太阳神三国杀这个项目,但是之前在github中下载后总是草草编译一直没有编译成功过,最近又重燃斗志决定深入研究一下. 分析应该 ...

  5. vs2008编译QT开源项目--太阳神三国杀源码分析(一) 项目编译及整体分析

    请参看 http://tieba.baidu.com/f?kz=1508964881 按照上面的网址教程,下载三国杀源码,swig工具,并下载最新的QT4.8.2 for vs2008.我本机已经安装 ...

  6. vs2008编译QT开源项目--太阳神三国杀源码分析(四) 动画

    太阳神三国杀中,每当玩家出杀或吃桃子时,就会有一个动画效果,使界面非常生动绚丽.现在我们就分析一下QT中动画的原理,及实现方式,这里我们只分析吃桃子时的动画效果实现.由于三国杀有多个在线玩家同时游戏, ...

  7. 如何获得最新的太阳神三国杀 自己Qt编译

    太阳神三国杀,是一个基于C++ QT GUI框架的三国杀非官方开源软件,开发者:Moligaloo(开发者网站:http://mogara.org/).可以在它上面体验一些不同的模式,尤其可以体验一些 ...

  8. vs2008编译QT开源项目--太阳神三国杀源码分析(三) 皮肤

    太阳神三国杀的界面很绚丽,界面上按钮的图标,鼠标移入移出时图标的变化,日志和聊天Widget的边框和半透明等效果,既可以通过代码来控制,也可以使用皮肤文件qss进行控制.下面我们分析一下三国杀的qss ...

  9. 开源项目-太阳神三国杀-QT4编译教程

    待更中 转载于:https://www.cnblogs.com/sinpener/p/10734692.html

最新文章

  1. App原生、混合、纯WEB开发模式的优劣分析
  2. 远程桌面连接数超过最大限制解决方法
  3. 操作系统——缓冲区溢出
  4. mac mysql 默认字符集_MacOS中Mysql设置默认字符集
  5. 合并K个有序数组(链表)【字节跳动面试算法题】
  6. Spring : spring-jcl-5.1.2.RELEASE.jar日志包
  7. springboot nacos_springboot集成nacos
  8. Linux Web基础
  9. android 屏幕分辨率 更改
  10. 功能测试几种方法简单介绍
  11. (五)结合大彩屏介绍Bus Hound:cmd.Phase.ofs(rep)
  12. node--puppeteer网页截屏
  13. 是非人生 — 一个菜鸟程序员的5年职场路 第28节
  14. Barrier与多线程
  15. webpack打包后的文件夹是空的_深入理解 Webpack 打包分块(下)
  16. Matlab 中保存运行的m文件
  17. 【操作系统】30天自制操作系统--(14)多任务1
  18. 深度网络设计技巧(五)之VAN:Visual Attention Network#超越Swin的纯CNN#
  19. WinCC项目函数之间相互调用
  20. 为什么写《大数据架构详解》这本书

热门文章

  1. 精选28页完整版毕业设计PPT文件
  2. C#判断字符串数组中是否有重复项
  3. 手机来电通核心模块——归属地数据库设计(Winsym原创)
  4. P5462_X龙珠邪教组织被我部侦破
  5. java中扫描仪程序_Java扫描仪delimiter()方法及示例
  6. 5.6 创建钱包服务
  7. 台式计算机一般多大功率,台式机一般要用多少瓦的电源?
  8. 众昂矿业刘金海:中国萤石产品分类及其用途
  9. Thinkcmf,Thinkcmf采集,Thinkcmf仿站
  10. 用c语言星号输出c字母,C语言格式化输出中的星号